নিম্নলিখিত অভিধানটি বিবেচনা করুন, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
আমি প্রথম এন কীটি ফিরিয়ে আনতে চাই: ডি থেকে মান জোড়া (এই ক্ষেত্রে N <= 4)। এটি করার সবচেয়ে দক্ষ পদ্ধতি কোনটি?
নিম্নলিখিত অভিধানটি বিবেচনা করুন, d:
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
আমি প্রথম এন কীটি ফিরিয়ে আনতে চাই: ডি থেকে মান জোড়া (এই ক্ষেত্রে N <= 4)। এটি করার সবচেয়ে দক্ষ পদ্ধতি কোনটি?
উত্তর:
"প্রথম এন" কীগুলির তেমন কোনও জিনিস 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())
iteritemsitems
take()পাইথন কোড বেসের কোথাও কোথাও একটি অংশ? অথবা, এটি এখানে আপনার উত্তরটিতে সংজ্ঞায়িতভাবে কার্যকরী হয়? জিজ্ঞাসা করা হচ্ছে যে এটি কোড বেসের একটি অংশ, আমি এটি খুঁজে পেতে / আমদানি করতে পারছি না। :)
যে কোনও কিছু পুনরুদ্ধার করার একটি খুব কার্যকরী উপায় হ'ল স্লাইসিংয়ের সাথে তালিকা বা অভিধানের বোঝাগুলি একত্রিত করা। আপনার যদি আইটেমগুলি অর্ডার করার প্রয়োজন না হয় (আপনি কেবল এন এলোমেলো জোড় চান), আপনি অভিধান অভিধানটি এর মতো ব্যবহার করতে পারেন:
# 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]}
পাইথনের 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))
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))
মূলত, ভিউ (ডিক্ট_াইটেমস )টিকে একটি পুনরুক্তিতে পরিণত করুন এবং তারপরে এটি পরবর্তী () দিয়ে পুনরাবৃত্তি করুন।
এটি এখানে দেখুন না। অর্ডার করা হবে না তবে সবচেয়ে সহজ সিনট্যাক্টিকালি যদি আপনার প্রয়োজন হয় কোনও অভিধান থেকে কিছু উপাদান নেওয়া।
n = 2
{key:value for key,value in d.items()[0:n]}
TypeError: 'dict_items' object is not subscriptable {key:value for key,value in stocks.items()[0:n]} (স্টকগুলি আমার অভিধানের নাম)
আপনার পাইথন অভিধান থেকে শীর্ষ এন উপাদানগুলি পেতে নিম্নলিখিত কোডের লাইনটি ব্যবহার করতে পারেন:
list(dictionaryName.items())[:N]
আপনার ক্ষেত্রে আপনি এটিকে পরিবর্তন করতে পারেন:
list(d.items())[:4]
বাছাই করার অভিধানগুলিতে পিইপি 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)]
পাই 3 এ, এটি কৌশলটি করবে
{A:N for (A,N) in [x for x in d.items()][:4]}
a 'এ': 3, 'বি': 2, 'সি': 3, 'ডি': 4
এটি আপনার ক্ষেত্রে 'সবচেয়ে দক্ষ' কোনটির উপর নির্ভর করে।
আপনি শুধুমাত্র একটি বিশাল অভিধানের একটি আধা-র্যান্ডম নমুনা চান foo, ব্যবহার foo.iteritems()এবং তা থেকে অনেক মান হিসাবে নেওয়া হিসাবে আপনি প্রয়োজন, এটি একটি অলস অপারেশন যে কী বা আইটেম একটি সুনির্দিষ্ট তালিকা তৈরির এড়াতে হবে।
যদি আপনাকে প্রথমে কীগুলি বাছাই করতে হয় তবে এর মতো কিছু ব্যবহার করার উপায় নেই keys = foo.keys(); keys.sort()বা sorted(foo.iterkeys())আপনাকে কীগুলির একটি সুস্পষ্ট তালিকা তৈরি করতে হবে। তারপরে প্রথম এন এর মাধ্যমে স্লাইস বা পুনরাবৃত্তি করুন keys।
বিটিডব্লিউ কেন আপনি 'দক্ষ' উপায় সম্পর্কে যত্নশীল হন? আপনি কি আপনার প্রোগ্রাম প্রোফাইল করেছেন? যদি আপনি না করেন তবে প্রথমে সুস্পষ্ট এবং সহজে বোঝার উপায়টি ব্যবহার করুন । সম্ভাবনা হ'ল এটি কোনও বাধা ছাড়াই বেশ ভাল করবে।
আপনি এটি বিভিন্ন উপায়ে যোগাযোগ করতে পারেন। অর্ডার গুরুত্বপূর্ণ হলে আপনি এটি করতে পারেন:
for key in sorted(d.keys()):
item = d.pop(key)
যদি অর্ডার কোনও উদ্বেগ না করে তবে আপনি এটি করতে পারেন:
for i in range(4):
item = d.popitem()
valueচেয়ে কল করা উচিত item।
অভিধান কোনও অর্ডার বজায় রাখে না, তাই শীর্ষ এন কী মান জোড়া বাছাইয়ের আগে এটি বাছাই করতে দেয়।
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)
একটি ডিক বিবেচনা করুন
d = {'a': 3, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
from itertools import islice
n = 3
list(islice(d.items(),n))
আইলিস ট্রিক করবে :) আশা করি এটি সাহায্য করবে!
এটি খুব মার্জিত নাও হতে পারে তবে আমার পক্ষে কাজ করে:
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
আমি উপরের কয়েকটি উত্তর চেষ্টা করে দেখেছি যে এর মধ্যে কয়েকটি সংস্করণ নির্ভর এবং সেগুলি 3.7 সংস্করণে কাজ করে না।
আমি আরও লক্ষ করি যে ৩. 3. থেকে সমস্ত অভিধান ক্রম অনুসারে অর্ডার করা হয়েছে যাতে আইটেমগুলি সন্নিবেশ করা হয়।
৩. ordered-এর পরে অভিধানের অর্ডার দেওয়া সত্ত্বেও আপনি অর্ডার করা কাঠামোগুলি নিয়ে কাজ করার আশা করছেন এমন কয়েকটি বিবৃতি কার্যকর বলে মনে হচ্ছে না।
ওপি প্রশ্নের উত্তর যা আমার পক্ষে সবচেয়ে ভাল কাজ করেছে।
itr = iter(dic.items())
lst = [next(itr) for i in range(3)]
lst = list(d.items())[:N]
list(d.items())[:4]। তালিকা () হ'ল উত্তরের অনেকের অন্তর্নিহিত বাস্তবায়ন।