পাইথন - প্রথম এন কীটি ফেরান: ডেক থেকে মান জোড়


108

নিম্নলিখিত অভিধানটি বিবেচনা করুন, d:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

আমি প্রথম এন কীটি ফিরিয়ে আনতে চাই: ডি থেকে মান জোড়া (এই ক্ষেত্রে N <= 4)। এটি করার সবচেয়ে দক্ষ পদ্ধতি কোনটি?


1
সতর্ক করা. উত্তরে অনেক ভুল তথ্য বলে মনে হচ্ছে। আমার পরীক্ষার দেখাতে একটি একক সমাধান দ্রুততর চেয়ে list(d.items())[:4]। তালিকা () হ'ল উত্তরের অনেকের অন্তর্নিহিত বাস্তবায়ন।
BSalita

উত্তর:


114

"প্রথম এন" কীগুলির তেমন কোনও জিনিস dictনেই কারণ কোন কীগুলি প্রথমে sertedোকানো হয়েছিল তা মনে নেই।

আপনি যে কোনও এন-কী-মান যুক্ত পেতে পারেন যদিও:

n_items = take(n, d.iteritems())

এটি রেসিপিগুলিtake থেকে প্রয়োগটি ব্যবহার করে :itertools

from itertools import islice

def take(n, iterable):
    "Return first n items of the iterable as a list"
    return list(islice(iterable, n))

এটি অনলাইনে কাজ করা দেখুন: আদর্শ one


পাইথন ৩.6 এর জন্য আপডেট Update

n_items = take(n, d.items())

42
আমি বিশ্বাস করি পাইথন 3iteritemsitems
মনিকা হেডনেক

1
@ মনিকা হেইডনেক, উজ্জ্বল, এই মন্তব্যটি যুক্ত করার জন্য আপনাকে ধন্যবাদ।
কার্ল

12
এখানে শিক্ষানবিস - take()পাইথন কোড বেসের কোথাও কোথাও একটি অংশ? অথবা, এটি এখানে আপনার উত্তরটিতে সংজ্ঞায়িতভাবে কার্যকরী হয়? জিজ্ঞাসা করা হচ্ছে যে এটি কোড বেসের একটি অংশ, আমি এটি খুঁজে পেতে / আমদানি করতে পারছি না। :)
স্কট বার্ডেন

81

যে কোনও কিছু পুনরুদ্ধার করার একটি খুব কার্যকরী উপায় হ'ল স্লাইসিংয়ের সাথে তালিকা বা অভিধানের বোঝাগুলি একত্রিত করা। আপনার যদি আইটেমগুলি অর্ডার করার প্রয়োজন না হয় (আপনি কেবল এন এলোমেলো জোড় চান), আপনি অভিধান অভিধানটি এর মতো ব্যবহার করতে পারেন:

# Python 2
first2pairs = {k: mydict[k] for k in mydict.keys()[:2]}
# Python 3
first2pairs = {k: mydict[k] for k in list(mydict)[:2]}

সাধারণত "এর জন্য এক্স ইন ওয়াই" লুপের তুলনায় এর মতো একটি বোধগতি সর্বদা দ্রুততর হয়। এছাড়াও, অভিধান কীগুলির একটি তালিকা তৈরি করতে .keys () ব্যবহার করে এবং সেই তালিকাটি টুকরো টুকরো করে আপনি যখন নতুন অভিধান তৈরি করেন তখন কোনও অপ্রয়োজনীয় কী 'স্পর্শ' এড়াতে পারবেন না।

যদি আপনার কীগুলির প্রয়োজন না হয় (কেবলমাত্র মানগুলি) তবে আপনি একটি তালিকা উপলব্ধি ব্যবহার করতে পারেন:

first2vals = [v for v in mydict.values()[:2]]

যদি আপনার কীগুলির উপর ভিত্তি করে মানগুলি বাছাই করা দরকার হয় তবে এটি বেশি ঝামেলা নয়:

first2vals = [mydict[k] for k in sorted(mydict.keys())[:2]]

অথবা আপনার কীগুলিও প্রয়োজন হলে:

first2pairs = {k: mydict[k] for k in sorted(mydict.keys())[:2]}

2
আপনি যদি অনেকগুলি কী নির্বাচন করতে চান তবে এটি একটি আরও ভাল সমাধান: অভিধান হিসাবে মান
জোড়গুলি,

1
@ fermat4214 আমি কি এই আদেশটি চালানোর সময় যদি আমার পুরো অভিধানটি মুদ্রণ করে তবে এটি কোনও সমস্যা?
লাইফের টেড টেলর

তালিকা (মায়িডিক্ট) [: 2] অপ্রয়োজনীয় যদি আপনার অভিধানটি বাছাই করার প্রয়োজন হয় না এবং কেবল প্রথম 2 উপাদান প্রয়োজন। অভিধানে যদি 1 মিলি কেভি জোড় থাকে? পুরো জিনিসটিকে একটি তালিকায় রূপান্তর করা ব্যয়বহুল। মার্ক বাইয়ার্সের সমাধানটি আরও ভাল।
জেজে

এই সমাধান করা উচিত!
গেন্টার

14

পাইথনের dictগুলি অর্ডার করা হয়নি, সুতরাং "প্রথম এন" কীগুলি জিজ্ঞাসা করা অর্থহীন।

collections.OrderedDictপরীক্ষা এলে যে কী দরকার বর্গ পাওয়া যায়। আপনি দক্ষতার সাথে এর প্রথম চারটি উপাদান পেতে পারেন

import itertools
import collections

d = collections.OrderedDict((('foo', 'bar'), (1, 'a'), (2, 'b'), (3, 'c'), (4, 'd')))
x = itertools.islice(d.items(), 0, 4)

for key, value in x:
    print key, value

itertools.isliceঅলসভাবে আপনাকে কোনও পুনরুক্তিকারী থেকে উপাদানগুলির একটি টুকরা নিতে দেয়। আপনি যদি ফলাফলটি পুনঃব্যবহারযোগ্য হতে চান তবে আপনাকে এটিকে কোনও তালিকায় বা অন্য কোনও ক্ষেত্রে রূপান্তর করতে হবে:

x = list(itertools.islice(d.items(), 0, 4))

অলস লাগছে না। `তালিকার চেয়ে 2x দীর্ঘ সময় নেয় (d.items ()) [: 4]
BSalita

12
foo = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5, 'f':6}
iterator = iter(foo.items())
for i in range(3):
    print(next(iterator))

মূলত, ভিউ (ডিক্ট_াইটেমস )টিকে একটি পুনরুক্তিতে পরিণত করুন এবং তারপরে এটি পরবর্তী () দিয়ে পুনরাবৃত্তি করুন।


2
চমত্কার উত্তর, এই পৃষ্ঠায় এটিই একমাত্র উত্তর যা আমার পক্ষে কাজ করেছিল এবং পাঠযোগ্যও। এছাড়াও, আমি পাইথন 3 দিয়ে এই কাজগুলি যাচাই করতে পারি, যা কিছু পুরানো উত্তর বলে মনে হয় না।
সিডিএএমএস

7

এটি এখানে দেখুন না। অর্ডার করা হবে না তবে সবচেয়ে সহজ সিনট্যাক্টিকালি যদি আপনার প্রয়োজন হয় কোনও অভিধান থেকে কিছু উপাদান নেওয়া।

n = 2
{key:value for key,value in d.items()[0:n]}

7
আমি আপনাকে কোড চেষ্টা করেছি কিন্তু আমি এই ত্রুটিটি পেয়েছি: TypeError: 'dict_items' object is not subscriptable {key:value for key,value in stocks.items()[0:n]} (স্টকগুলি আমার অভিধানের নাম)
মুনড্রা

2
@ মুন্ড্রা - অভিধানের আইটেমগুলি চালানোর আগে তালিকায় রূপান্তর করতে হবে। কোডের উপরে, লাইনটি যদি {কী হয় তবে কাজ করে: কীটির মান, তালিকার মান (d.items ()) [0: n]}
রাজেশ মপ্পু

{এ: এন এর জন্য (এ, এন) [এক্স এর জন্য এক্স x ডি.াইটেমস ()] [: 4]}
ফরিদ খফিজভ

6

আপনার পাইথন অভিধান থেকে শীর্ষ এন উপাদানগুলি পেতে নিম্নলিখিত কোডের লাইনটি ব্যবহার করতে পারেন:

list(dictionaryName.items())[:N]

আপনার ক্ষেত্রে আপনি এটিকে পরিবর্তন করতে পারেন:

list(d.items())[:4]

3

বাছাই করার অভিধানগুলিতে পিইপি 0265 দেখুন । তারপরে উল্লিখিত পুনরাবৃত্তিযোগ্য কোডটি ব্যবহার করুন।

বাছাই করা কী-মানের জোড়গুলিতে আপনার আরও দক্ষতার প্রয়োজন হলে। একটি পৃথক ডেটা কাঠামো ব্যবহার করুন। এটি হ'ল, এটি বাছাই করা অর্ডার এবং কী-মান সংঘগুলি বজায় রাখে।

যেমন

import bisect

kvlist = [('a', 1), ('b', 2), ('c', 3), ('e', 5)]
bisect.insort_left(kvlist, ('d', 4))

print kvlist # [('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', 5)]



1

এটি আপনার ক্ষেত্রে 'সবচেয়ে দক্ষ' কোনটির উপর নির্ভর করে।

আপনি শুধুমাত্র একটি বিশাল অভিধানের একটি আধা-র্যান্ডম নমুনা চান foo, ব্যবহার foo.iteritems()এবং তা থেকে অনেক মান হিসাবে নেওয়া হিসাবে আপনি প্রয়োজন, এটি একটি অলস অপারেশন যে কী বা আইটেম একটি সুনির্দিষ্ট তালিকা তৈরির এড়াতে হবে।

যদি আপনাকে প্রথমে কীগুলি বাছাই করতে হয় তবে এর মতো কিছু ব্যবহার করার উপায় নেই keys = foo.keys(); keys.sort()বা sorted(foo.iterkeys())আপনাকে কীগুলির একটি সুস্পষ্ট তালিকা তৈরি করতে হবে। তারপরে প্রথম এন এর মাধ্যমে স্লাইস বা পুনরাবৃত্তি করুন keys

বিটিডব্লিউ কেন আপনি 'দক্ষ' উপায় সম্পর্কে যত্নশীল হন? আপনি কি আপনার প্রোগ্রাম প্রোফাইল করেছেন? যদি আপনি না করেন তবে প্রথমে সুস্পষ্ট এবং সহজে বোঝার উপায়টি ব্যবহার করুন । সম্ভাবনা হ'ল এটি কোনও বাধা ছাড়াই বেশ ভাল করবে।


এটি একটি আর্থিক প্রোগ্রামের জন্য একটি আবেদন ছিল এবং আমি কোডের প্রতিটি লাইন যথাসম্ভব দক্ষতার সাথে গড়ে তোলার চেষ্টা করি attempt আমি প্রোগ্রামটির প্রোফাইল করিনি এবং এটি সম্ভবত বোতল ঘাড় হবে না সম্মত তবে আমি ডিফল্টরূপে দক্ষ সমাধান চাইতে চাই। উত্তরের জন্য ধন্যবাদ.
জেসন স্ট্রিম্পেল

0

আপনি এটি বিভিন্ন উপায়ে যোগাযোগ করতে পারেন। অর্ডার গুরুত্বপূর্ণ হলে আপনি এটি করতে পারেন:

for key in sorted(d.keys()):
  item = d.pop(key)

যদি অর্ডার কোনও উদ্বেগ না করে তবে আপনি এটি করতে পারেন:

for i in range(4):
  item = d.popitem()

প্রথম স্নিপেটে আপনার সম্ভবত এটি স্পষ্টতার valueচেয়ে কল করা উচিত item
agf

0

অভিধান কোনও অর্ডার বজায় রাখে না, তাই শীর্ষ এন কী মান জোড়া বাছাইয়ের আগে এটি বাছাই করতে দেয়।

import operator
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
#itemgetter(0)=sort by keys, itemgetter(1)=sort by values

এখন আমরা শীর্ষ 'এন' উপাদানগুলি পুনরুদ্ধার করতে পারি: পদ্ধতিটির কাঠামোটি এভাবে ব্যবহার করে:

def return_top(elements,dictionary_element):
    '''Takes the dictionary and the 'N' elements needed in return
    '''
    topers={}
    for h,i in enumerate(dictionary_element):
        if h<elements:
            topers.update({i:dictionary_element[i]})
    return topers

শীর্ষ 2 উপাদানগুলি পেতে কেবল এই কাঠামোটি ব্যবহার করুন:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4}
d=dict(sorted(d.items(),key=operator.itemgetter(1),reverse=True))
d=return_top(2,d)
print(d)

0

পাইথন 3 এবং তদূর্ধের জন্য, প্রথম এন জোড়গুলি নির্বাচন করতে

n=4
firstNpairs = {k: Diction[k] for k in list(Diction.keys())[:n]}

0

একটি ডিক বিবেচনা করুন

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

from itertools import islice
n = 3
list(islice(d.items(),n))

আইলিস ট্রিক করবে :) আশা করি এটি সাহায্য করবে!


0

এটি খুব মার্জিত নাও হতে পারে তবে আমার পক্ষে কাজ করে:

d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}

x= 0
for key, val in d.items():
    if x == 2:
        break
    else:
        x += 1
        # Do something with the first two key-value pairs

0

আমি উপরের কয়েকটি উত্তর চেষ্টা করে দেখেছি যে এর মধ্যে কয়েকটি সংস্করণ নির্ভর এবং সেগুলি 3.7 সংস্করণে কাজ করে না।

আমি আরও লক্ষ করি যে ৩. 3. থেকে সমস্ত অভিধান ক্রম অনুসারে অর্ডার করা হয়েছে যাতে আইটেমগুলি সন্নিবেশ করা হয়।

৩. ordered-এর পরে অভিধানের অর্ডার দেওয়া সত্ত্বেও আপনি অর্ডার করা কাঠামোগুলি নিয়ে কাজ করার আশা করছেন এমন কয়েকটি বিবৃতি কার্যকর বলে মনে হচ্ছে না।

ওপি প্রশ্নের উত্তর যা আমার পক্ষে সবচেয়ে ভাল কাজ করেছে।

itr = iter(dic.items())
lst = [next(itr) for i in range(3)]

এফওয়াইআই, 5x এর চেয়ে ধীরlst = list(d.items())[:N]
BSalita
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.