কীভাবে কীভাবে আমি একটি অভিধান বাছাই করতে পারি?


938

কোন সুন্দর উপায় থেকে যেতে {2:3, 1:89, 4:5, 3:0}হবে {1:89, 2:3, 3:0, 4:5}?
আমি কিছু পোস্ট চেক করেছি তবে তারা সবাই "সাজানো" অপারেটর ব্যবহার করে যা tuples ফেরত দেয়।


39
শব্দকোষগুলি অন্তর্নিহিতভাবে সাজানো থাকে না। অভিধান প্রদর্শন করা অন্য বিষয়। যাইহোক, আপনার কিসের জন্য এটি বাছাই করার দরকার আছে?
কার্ল নচেটেল

15
অভিধানগুলি বাছাই করা হয় না। তারা ঠিক না। যদি আপনি উপাদানগুলির মধ্যে যেতে চান তবে আপনাকে এমন কিছু করতে হবে যেমন আপনি "বাছাই করা কী (d.keys ())" এর মতো ডি বাছাই করে যেমন ধরেছিলেন তার মতো করে কিছু বলেছিলেন
রায়

3
@ কার্লকনেটেল - আমার ব্যবহারের ক্ষেত্রে হ'ল আমার কাছে একটি সি এল এল অ্যাপ্লিকেশন রয়েছে যাতে একটি প্রাথমিক মেনু রয়েছে এবং মেনু অপশনগুলি কী হিসাবে অভিধানে রয়েছে। আমি ব্যবহারকারী সংবাদের জন্য কীগুলি বর্ণমালায় প্রদর্শন করতে চাই।
র্যান্ডি


4
নোট করুন এখন dicts সন্নিবেশ আদেশ দ্বারা (অজগর 3.6+) অর্ডার করা হয়। নীচে কিছু উত্তর এটি ইঙ্গিত।
matiasg

উত্তর:


939

স্ট্যান্ডার্ড পাইথন অভিধানগুলি সীমানাবিহীন। এমনকি আপনি যদি (কী, মান) জোড়গুলি বাছাই করেন তবে আপনি সেগুলিকে dictএমনভাবে সংরক্ষণ করতে পারবেন না যাতে ক্রম সংরক্ষণ করা যায়।

সবচেয়ে সহজ উপায় হ'ল ব্যবহার করা OrderedDict, যা উপাদানগুলি সন্নিবেশ করা হয়েছে সেটিকে মনে করে:

In [1]: import collections

In [2]: d = {2:3, 1:89, 4:5, 3:0}

In [3]: od = collections.OrderedDict(sorted(d.items()))

In [4]: od
Out[4]: OrderedDict([(1, 89), (2, 3), (3, 0), (4, 5)])

উপায় odমুদ্রিত আউট কিছু মনে করবেন না ; এটি প্রত্যাশার মতো কাজ করবে:

In [11]: od[1]
Out[11]: 89

In [12]: od[3]
Out[12]: 0

In [13]: for k, v in od.iteritems(): print k, v
   ....: 
1 89
2 3
3 0
4 5

পাইথন ঘ

পাইথন 3 ব্যবহারকারীর জন্য, এর .items()পরিবর্তে একজনকে ব্যবহার করা দরকার .iteritems():

In [13]: for k, v in od.items(): print(k, v)
   ....: 
1 89
2 3
3 0
4 5

1
আমি এটি ব্যবহার করেছি এবং এটি কাজ করে, আমি এর আরও কোড এবং অপ্রয়োজনীয়তা অনুমান করি তবে কাজটি হয়ে যায়, # অর্ডারড ডিক্ট ডি = {2: 3, 1:89, 4: 5, 3: 0 D অর্ডারডিক্ট = {s বাছাই করার জন্য (ডি.ইটারকিজ ()): অর্ডারডিক্ট [কী] = ডি [কী]
অ্যান্টনি

4
@achrysochoou: যদি এটি কাজ করে তবে অবশ্যই এটি নিছক ভাগ্য দ্বারা হয়েছিল। যেমনটি আপনাকে বলা হয়েছে, নিয়মিত অভিধানগুলির বাছাই করার কোনও ধারণা নেই, আপনি কীগুলি বাছাই করা বা এলোমেলোভাবে নির্ধারণ করে তা বিবেচনা করে না।
রিকার্ডো কর্ডেনেস

21
অজগর জন্য 3.7+:sorted_dict = dict(sorted(unsorted_dict.items()))
aksh1618

10
অজগর 3.7+ এর অর্ডারডিক্টের দরকার নেই কারণ এটি এখন ডিফল্ট অনুসারে অর্ডার করে :-)
অ্যানিউওয়ে

3
পাইথন ৩.7.৪ ম্যানুয়াল থেকে: "একটি অভিধানে পারফর্মিং লিস্ট (ডি) সন্নিবেশ ক্রমে ডিকশনারে ব্যবহৃত সমস্ত কীগুলির একটি তালিকা ফেরত দেয়"। সুতরাং সন্নিবেশ ক্রম এমন কিছু যা সংরক্ষণিত এবং আমরা নির্ভর করতে পারি।
মোস্তফা হাদিয়ান

415

শব্দকোষগুলি নিজেরাই আইটেমগুলি অর্ডার করে না, আপনি কি কোনও ক্রমে এগুলি মুদ্রণ করতে চান, এখানে কয়েকটি উদাহরণ রয়েছে:

পাইথন ২.৪ এবং এর উপরে:

mydict = {'carl':40,
          'alan':2,
          'bob':1,
          'danny':3}

for key in sorted(mydict):
    print "%s: %s" % (key, mydict[key])

দেয়:

alan: 2
bob: 1
carl: 40
danny: 3

(২.৪ এর নিচে পাইথন :)

keylist = mydict.keys()
keylist.sort()
for key in keylist:
    print "%s: %s" % (key, mydict[key])

সূত্র: http://www.saltycrane.com/blog/2007/09/how-to-sort-python-d অভিধান- by- keys /


2
আপনি এনপিইর উত্তর হিসাবে পাইথন ২.৪++ এও অর্ডারডিক্ট ব্যবহার করতে পারেন
রডটেক

1
এবং আপনি যদি আইটেমগুলি ব্যবহার করেন () তবে আপনি এটি করতে পারেনfor key, value in sorted(mydict.items())"
বীপ_চেক

শব্দকোষগুলি নিজেরাই আইটেমগুলি অর্ডার করে না -> আর সত্য নয়!
খনি

কীভাবে আসবেন, আপনি ব্যাখ্যা করতে পারেন?
জেমস

204

থেকে পাইথন এর collectionsগ্রন্থাগার ডকুমেন্টেশন :

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])

4
অসাধারণ! ছেলেরা যদি আপনি অর্ডার (সাজানো করার আরোহী) বিপরীত করতে চান তাহলে আপনি কেবল যোগ reverse=TrueউদাঃOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
benscabbia

1
পাইচার্মে, আমি যে কোনও অভিধান ব্যবহার করি না কেন, আমি সর্বদা এই সতর্কতাটি Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
পাই

153

সিপিথন / পাইপাই 3.6 এবং যে কোনও পাইথন 3.7 বা তারও বেশি এর জন্য এটি সহজেই সম্পন্ন করা হয়:

>>> d = {2:3, 1:89, 4:5, 3:0}
>>> dict(sorted(d.items()))
{1: 89, 2: 3, 3: 0, 4: 5}

3
একই জিনিস লেখার আরেকটি উপায় একটি বোধগম্যতা ব্যবহার করুন: {key:d[key] for key in sorted(d.keys())}
ফ্লো 2 কে

41

পাইথন মডিউলগুলির একটি সংখ্যা রয়েছে যা অভিধান প্রয়োগগুলি সরবরাহ করে যা স্বয়ংক্রিয়ভাবে সাজানো ক্রমে কীগুলি বজায় রাখে। খাঁটি-পাইথন এবং দ্রুত-সি-সি বাস্তবায়নের জন্য সাজানো কন্টেইনার মডিউলটি বিবেচনা করুন । এখানে একটা হল কর্মক্ষমতা তুলনা অন্যান্য জনপ্রিয় অপশন পরস্পর বিরুদ্ধে benchmarked সঙ্গে।

অর্ডার করা ডিক ব্যবহার করা একটি অপর্যাপ্ত সমাধান, যদি আপনার পুনরাবৃত্তি করার সময় ক্রমাগত কী / মান জোড় যুক্ত করতে এবং মুছতে হয়।

>>> from sortedcontainers import SortedDict
>>> d = {2:3, 1:89, 4:5, 3:0}
>>> s = SortedDict(d)
>>> s.items()
[(1, 89), (2, 3), (3, 0), (4, 5)]

সাউটডিক্ট টাইপটি ইনডেক্সড লোকেশন লকআপস এবং ডিলিটকে সমর্থন করে যা বিল্ট-ইন ডিক্ট টাইপের মাধ্যমে সম্ভব নয়।

>>> s.iloc[-1]
4
>>> del s.iloc[2]
>>> s.keys()
SortedSet([1, 2, 4])

32

কেবল:

d = {2:3, 1:89, 4:5, 3:0}
sd = sorted(d.items())

for k,v in sd:
    print k, v

আউটপুট:

1 89
2 3
3 0
4 5

6
sdঅভিধান নয়, টিপলগুলির একটি তালিকা। (যদিও এখনও দরকারী।)
নিশচি

24

অন্যরা যেমন উল্লেখ করেছে, অভিধানগুলি অন্তর্নিহিতভাবে সীমান্তহীন। তবে, যদি ইস্যুটি কেবল অর্ডার করা ফ্যাশনে অভিধানগুলি প্রদর্শন করে তবে __str__আপনি একটি অভিধান সাবক্লাসে পদ্ধতিটি ওভাররাইড করতে পারেন এবং বিল্টিনের চেয়ে এই অভিধান বর্গটি ব্যবহার করতে পারেন dict। যেমন।

class SortedDisplayDict(dict):
   def __str__(self):
       return "{" + ", ".join("%r: %r" % (key, self[key]) for key in sorted(self)) + "}"


>>> d = SortedDisplayDict({2:3, 1:89, 4:5, 3:0})
>>> d
{1: 89, 2: 3, 3: 0, 4: 5}

দ্রষ্টব্য, কীগুলি কীভাবে সংরক্ষণ করা হয় সে সম্পর্কে কিছুই পরিবর্তন হয় না, আপনি যখন তাদের উপর পুনরাবৃত্তি করবেন তখন তারা যে ক্রমটি ফিরে আসবে ইত্যাদি ঠিক কীভাবে তারা printপাইথন কনসোলে প্রদর্শিত হবে বা কীভাবে প্রদর্শন করবে।


19

অন্য একটি উপায় পাওয়া গেছে:

import json
print json.dumps(d, sort_keys = True)

আপডেট:
১. এটি নেস্টেড অবজেক্টগুলিও বাছাই করে (ধন্যবাদ @ ড্যানিয়েলএফ)।
২. পাইথন অভিধানগুলি আনঅর্ডারড তাই এটি মুদ্রণের জন্য উপযুক্ত বা কেবল স্ট্রিংকে নির্ধারিত।


তবে এটি নেস্টেড অবজেক্টগুলির কীগুলিও বাছাই করে, যা সম্ভবত প্রয়োজন হয় না।
ড্যানিয়েল এফ

দ্রষ্টব্য যে এটি কেবল অভিধানগুলি বাছাই করে, তালিকাগুলি নয়, যেমন ডিক.কেজগুলি () সাজানো হবে না কারণ এটি একটি তালিকা।
অ্যান্ড্রু


13

পাইথন ৩.6-এর আগে পাইথন ডিকশনারিটি আনর্ডার্ড করা হয়েছিল। পাইথন ৩.6 এর সিপিথন বাস্তবায়নে অভিধান সন্নিবেশ ক্রম রাখে। পাইথন ৩.7 থেকে এটি ভাষার বৈশিষ্ট্য হয়ে উঠবে।

পাইথন ৩.6 ( https://docs.python.org/3.6/whatsnew/3.6.html#whatnew36-compactdict ) এর চেঞ্জলগে :

এই নতুন বাস্তবায়নের ক্রম-সংরক্ষণের দিকটি একটি বাস্তবায়নের বিশদ হিসাবে বিবেচিত হয় এবং এর উপর নির্ভর করা উচিত নয় (এটি ভবিষ্যতে পরিবর্তিত হতে পারে, তবে ভাষাটির বৈশিষ্ট্য পরিবর্তন করার আগে কয়েকটি নতুন প্রকাশের জন্য ভাষায় এই নতুন ডিক প্রয়োগকরণের ইচ্ছা রয়েছে) সমস্ত বর্তমান এবং ভবিষ্যতের পাইথন বাস্তবায়নের জন্য অর্ডার-সংরক্ষণের শব্দার্থকে ম্যান্ডেট করতে; এটি ভাষাটির পুরানো সংস্করণগুলির সাথে পিছনে-সামঞ্জস্যতা রক্ষা করতে সহায়তা করে যেখানে এলোমেলো পুনরাবৃত্তি আদেশ এখনও কার্যকর রয়েছে, যেমন পাইথন 3.5)।

পাইথন ৩.7 এর নথিতে ( https://docs.python.org/3.7/tutorial/datastructures.html#dferences ):

অভিধানে পারফর্মিং তালিকা (ডি) অভিধানে ব্যবহৃত সমস্ত কীগুলির একটি তালিকা সন্নিবেশ ক্রমে (যদি আপনি এটি বাছাই করতে চান তবে পরিবর্তে বাছাই করা (ডি)) ব্যবহার করুন returns

পূর্ববর্তী সংস্করণগুলির বিপরীতে, আপনি পাইথন 3.6 / 3.7 এর পরে একটি ডিক বাছাই করতে পারেন। আপনি যদি অভ্যন্তরীণ সাব-ডিক সহ কোনও নেস্টেড ডিককে বাছাই করতে চান তবে আপনি এটি করতে পারেন:

test_dict = {'a': 1, 'c': 3, 'b': {'b2': 2, 'b1': 1}}

def dict_reorder(item):
    return {k: sort_dict(v) if isinstance(v, dict) else v for k, v in sorted(item.items())}

reordered_dict = dict_reorder(test_dict)

https://gist.github.com/ligyxy/f60f0374defc383aa098d44cfbd318eb


11

কী ব্যবহার করে পাইথন ডিকটি বাছাই করার জন্য আমি এখানে কিছু সহজ সমাধান পেয়েছি pprint। যেমন।

>>> x = {'a': 10, 'cd': 20, 'b': 30, 'az': 99} 
>>> print x
{'a': 10, 'b': 30, 'az': 99, 'cd': 20}

কিন্তু প্রিন্ট ব্যবহার করার সময় এটি সাজানো ডিক ফিরে আসবে

>>> import pprint 
>>> pprint.pprint(x)
{'a': 10, 'az': 99, 'b': 30, 'cd': 20}

10

একটি অভিধান বাছাই করার একটি সহজ উপায় আছে।

আপনার প্রশ্ন অনুসারে,

সমাধানটি হ'ল:

c={2:3, 1:89, 4:5, 3:0}
y=sorted(c.items())
print y

(যেখানে সি, আপনার অভিধানের নাম।)

এই প্রোগ্রামটি নিম্নলিখিত আউটপুট দেয়:

[(1, 89), (2, 3), (3, 0), (4, 5)]

যেমন আপনি চেয়েছিলেন

আরেকটি উদাহরণ হ'ল:

d={"John":36,"Lucy":24,"Albert":32,"Peter":18,"Bill":41}
x=sorted(d.keys())
print x

আউটপুট দেয়:['Albert', 'Bill', 'John', 'Lucy', 'Peter']

y=sorted(d.values())
print y

আউটপুট দেয়:[18, 24, 32, 36, 41]

z=sorted(d.items())
print z

আউটপুট দেয়:

[('Albert', 32), ('Bill', 41), ('John', 36), ('Lucy', 24), ('Peter', 18)]

তাই কীগুলি, মান এবং আইটেমগুলিতে এটিকে পরিবর্তন করে আপনি যা চান তা মুদ্রণ করতে পারেন H এটি সাহায্য করে!


8

আপনি যা চান ঠিক তা তৈরি করবে:

 D1 = {2:3, 1:89, 4:5, 3:0}

 sort_dic = {}

 for i in sorted(D1):
     sort_dic.update({i:D1[i]})
 print sort_dic


{1: 89, 2: 3, 3: 0, 4: 5}

তবে এটি করার সঠিক উপায় নয়, কারণ, এটি বিভিন্ন অভিধানের সাথে একটি স্বতন্ত্র আচরণ দেখাতে পারে, যা আমি সম্প্রতি শিখেছি। অতএব নিখুঁত উপায় টিম দ্বারা উত্সাহিত আমার প্রশ্নের প্রতিক্রিয়া যা আমি এখানে ভাগ করছি।

from collections import OrderedDict
sorted_dict = OrderedDict(sorted(D1.items(), key=lambda t: t[0]))

"বিভিন্ন অভিধানের সাথে স্বতন্ত্র আচরণ দেখায়" এর অর্থ কী? সাজানো "স্বতন্ত্র আচরণ" কী এমনটি পরিচালনা করতে পারে না?
ingyhere

6

আমি মনে করি সবচেয়ে সহজতম জিনিসটি হ'ল কীটি দ্বারা ডিকটি বাছাই করা এবং সাজানো কীটি সংরক্ষণ করুন: একটি নতুন ডিকের মধ্যে মান জোড়া pair

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be neccessary
        dict2[key] = dict1[key]

এটি পরিষ্কার করার জন্য:

dict1 = {'renault': 3, 'ford':4, 'volvo': 1, 'toyota': 2} 
dict2 = {}                  # create an empty dict to store the sorted     values
for key in sorted(dict1.keys()):
    if not key in dict2:    # Depending on the goal, this line may not be  neccessary
        value = dict1[key]
        dict2[key] = value

6

আপনার প্রশ্ন অনুসারে আপনি বর্তমান অভিধানটি কী দ্বারা বাছাই করে একটি নতুন অভিধান তৈরি করতে পারেন।

এটি আপনার অভিধান

d = {2:3, 1:89, 4:5, 3:0}

লাম্বদা ফাংশনটি ব্যবহার করে এই ডিটিকে বাছাই করে একটি নতুন অভিধান ডি 1 তৈরি করুন

d1 = dict(sorted(d.items(), key = lambda x:x[0]))

ডি 1 টি {1: 89, 2: 3, 3: 0, 4: 5} হওয়া উচিত, ডি-র কীগুলির উপর ভিত্তি করে সাজানো।


5

পাইথন ডিক্টগুলি আন-অর্ডারযুক্ত। সাধারণত, এটি কোনও সমস্যা নয় যেহেতু সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে হ'ল লুক করা।

আপনি যা চান তা করার সহজ উপায় collections.OrderedDictহ'ল সর্ট ক্রমে উপাদানগুলি সন্নিবেশ করানো।

ordered_dict = collections.OrderedDict([(k, d[k]) for k in sorted(d.keys())])

যদি আপনাকে পুনরাবৃত্তি করা দরকার, উপরের অন্যরা যেমন পরামর্শ দিয়েছে, সর্বাধিক সহজ উপায় হ'ল সাজানো কীগুলির মাধ্যমে পুনরাবৃত্তি করা। Examples-

কীগুলি অনুসারে বাছাই করা মানগুলি:

# create the dict
d = {k1:v1, k2:v2,...}
# iterate by keys in sorted order
for k in sorted(d.keys()):
    value = d[k]
    # do something with k, value like print
    print k, value

কী অনুসারে বাছাই করা মানগুলির তালিকা পান:

values = [d[k] for k in sorted(d.keys())]

2
for k,value in sorted(d.items()):আরও ভাল: লুপের মধ্যে আবার কী দিয়ে ডিকটি অ্যাক্সেস করা এড়ানো
জ্যান-ফ্রানসোয়া ফ্যাব্রে

4

আমি একক লাইন ডেক বাছাই সঙ্গে আসা।

>> a = {2:3, 1:89, 4:5, 3:0}
>> c = {i:a[i] for i in sorted(a.keys())}
>> print(c)
{1: 89, 2: 3, 3: 0, 4: 5}
[Finished in 0.4s]

আশা করি এটি সহায়ক হবে।


4

এই ফাংশনটি কোনও অভিধানকে এর কী দ্বারা পুনরাবৃত্তভাবে সাজান sort অর্থাৎ অভিধানে যদি কোনও মানও অভিধান থাকে তবে এটিও এর কী দ্বারা বাছাই করা হবে। আপনি যদি সিপিথন ৩.6 বা তার থেকেও বেশি চালিয়ে যাচ্ছেন তবে একটি সাধারণ পরিবর্তনের dictপরিবর্তে ব্যবহার করা OrderedDictযেতে পারে।

from collections import OrderedDict

def sort_dict(d):
    items = [[k, v] for k, v in sorted(d.items(), key=lambda x: x[0])]
    for item in items:
        if isinstance(item[1], dict):
            item[1] = sort_dict(item[1])
    return OrderedDict(items)
    #return dict(items)

2

ছেলেরা আপনি জিনিসগুলিকে জটিল করে তুলছেন ... এটি সত্যিই সহজ

from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)

আউটপুটটি হ'ল:

{'A':2,'B':1,'C':3}

উত্সাহিত হয়েছে কারণ আমি তাদের প্রিন্টের জন্য প্রার্টস প্রকারের অভিধানগুলি জানতাম না, তবে ওপি সত্যায়িতভাবে বাছাই করা ডিক থেকে "চালিত" সম্পর্কে জিজ্ঞাসা করেছে, অর্থাৎ ওপি মনে হয় এমন কিছু চায় যা মেমোরিতে সাজানো থাকে সম্ভবত কিছু অ্যালগরিদমের জন্য যার জন্য বাছাই করা চাবি দরকার
ক্যাপ্টেন লেপটন

এই পদ্ধতিটি শৃঙ্খলাবদ্ধ অ্যাসাইনমেন্টের অনুমতি দেবে না কারণ পিপ্রিন্টের কোনওটিই প্রত্যাবর্তন করে না। >>> অ্যাডিক্ট = {'বি': 1, 'এ': 2, 'সি': 3} >>> পিপিডিক্ট = পিপ্রিন্ট (অ্যাডিক্ট) {'এ': 2, 'বি': 1, 'সি': 3} >>> ppdict.type () ট্রেসব্যাক (সর্বশেষতম কল শেষ): ফাইল "<stdin>", লাইন 1, <মডুল> অ্যাট্রিবিউট এরিয়ার: 'কিছুই নেই টাইপ' অবজেক্টটির কোনও 'গুণ' টাইপ নেই

2

সবচেয়ে সহজ সমাধানটি হ'ল ডিক কী-এর একটি তালিকা পাওয়া উচিত যাতে সাজানো ক্রম থাকে এবং তারপরে ডিকের উপর পুনরাবৃত্তি হয়। উদাহরণ স্বরূপ

a1 = {'a':1, 'b':13, 'd':4, 'c':2, 'e':30}
a1_sorted_keys = sorted(a1, key=a1.get, reverse=True)
for r in a1_sorted_keys:
    print r, a1[r]

নিম্নলিখিতটি আউটপুট (ডিসেন্ডেন্ডিং অর্ডার) হবে

e 30
b 13
d 4
c 2
a 1

2

এটি করার একটি সহজ উপায়:

d = {2:3, 1:89, 4:5, 3:0}

s = {k : d[k] for k in sorted(d)}

s
Out[1]: {1: 89, 2: 3, 3: 0, 4: 5} 

1

২.7-এ দুটি পদ্ধতির একটি সময়ের তুলনা তাদের কার্যত অভিন্ন হিসাবে দেখায়:

>>> setup_string = "a = sorted(dict({2:3, 1:89, 4:5, 3:0}).items())"
>>> timeit.timeit(stmt="[(k, val) for k, val in a]", setup=setup_string, number=10000)
0.003599141953657181

>>> setup_string = "from collections import OrderedDict\n"
>>> setup_string += "a = OrderedDict({1:89, 2:3, 3:0, 4:5})\n"
>>> setup_string += "b = a.items()"
>>> timeit.timeit(stmt="[(k, val) for k, val in b]", setup=setup_string, number=10000)
0.003581275490432745 

1
from operator import itemgetter
# if you would like to play with multiple dictionaries then here you go:
# Three dictionaries that are composed of first name and last name.
user = [
    {'fname': 'Mo', 'lname': 'Mahjoub'},
    {'fname': 'Abdo', 'lname': 'Al-hebashi'},
    {'fname': 'Ali', 'lname': 'Muhammad'}
]
#  This loop will sort by the first and the last names.
# notice that in a dictionary order doesn't matter. So it could put the first name first or the last name first. 
for k in sorted (user, key=itemgetter ('fname', 'lname')):
    print (k)

# This one will sort by the first name only.
for x in sorted (user, key=itemgetter ('fname')):
    print (x)



0

আমার পরামর্শটি হ'ল এটি আপনাকে আইটেম যুক্ত করার সাথে সাথে ডিক বাছাই করতে বা ডিকটিকে বাছাই করতে দেয় এবং ভবিষ্যতে আইটেম যুক্ত করার প্রয়োজন হতে পারে:

গঠন করুন dictআপনি পাশাপাশি যেতে শুরু থেকেআপনার কীগুলির তালিকা সহ একটি দ্বিতীয় ডেটা কাঠামো, একটি তালিকা রয়েছে। দ্বিখণ্ডিত প্যাকেজের একটি ইনসোর্ট ফাংশন রয়েছে যা একটি সাজানো তালিকায় সন্নিবেশ করতে দেয়, বা আপনার ডিককে সম্পূর্ণরূপে পপুলেশন করার পরে আপনার তালিকাটিকে বাছাই করে। এখন, আপনি যখন আপনার ডিকটি নিয়ে পুনরাবৃত্তি করবেন, আপনি ডকের কাঠামোর প্রতিনিধিত্ব (যা বাছাইয়ের জন্য তৈরি করা হয়নি) উদ্বিগ্ন না হয়ে অর্ডার ফ্যাশনে প্রতিটি কী অ্যাক্সেসের জন্য তালিকার উপরে পুনরাবৃত্তি করুন।


-1
l = dict.keys()
l2 = l
l2.append(0)
l3 = []
for repeater in range(0, len(l)):
    smallnum = float("inf")
    for listitem in l2:
        if listitem < smallnum:
            smallnum = listitem
    l2.remove(smallnum)
    l3.append(smallnum)
l3.remove(0)
l = l3

for listitem in l:
    print(listitem)

3
অন্যান্য 14 টি উত্তর রয়েছে। আপনি কি আপনার কোডটি কিছুটা ব্যাখ্যা করতে পারেন এবং কেন এটি অন্যান্য সমাধানগুলির চেয়ে ভাল হতে পারে?
ফেলিক্সএফডি

ডাউনভোট - সংক্ষিপ্ত অর্থহীন ভেরিয়েবলের নাম l, l2, l3 সহ সুন্দর অপঠনযোগ্য কোড। পাইথনের মানক ক্রিয়াকলাপ সম্পর্কে জ্ঞানহীন একটি অপ্রত্যক্ষ এবং অদক্ষ অ্যালগরিদমের একটি প্রচেষ্টা বলে মনে হয় এবং মূল পোস্টে ছোট উদাহরণের সাথে পরীক্ষা করা কোনও ক্ষেত্রে কার্যকর হয় না।
ক্যাপ্টেন লেপটন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.