কোন সুন্দর উপায় থেকে যেতে {2:3, 1:89, 4:5, 3:0}
হবে {1:89, 2:3, 3:0, 4:5}
?
আমি কিছু পোস্ট চেক করেছি তবে তারা সবাই "সাজানো" অপারেটর ব্যবহার করে যা tuples ফেরত দেয়।
কোন সুন্দর উপায় থেকে যেতে {2:3, 1:89, 4:5, 3:0}
হবে {1:89, 2:3, 3:0, 4:5}
?
আমি কিছু পোস্ট চেক করেছি তবে তারা সবাই "সাজানো" অপারেটর ব্যবহার করে যা tuples ফেরত দেয়।
উত্তর:
স্ট্যান্ডার্ড পাইথন অভিধানগুলি সীমানাবিহীন। এমনকি আপনি যদি (কী, মান) জোড়গুলি বাছাই করেন তবে আপনি সেগুলিকে 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
sorted_dict = dict(sorted(unsorted_dict.items()))
শব্দকোষগুলি নিজেরাই আইটেমগুলি অর্ডার করে না, আপনি কি কোনও ক্রমে এগুলি মুদ্রণ করতে চান, এখানে কয়েকটি উদাহরণ রয়েছে:
পাইথন ২.৪ এবং এর উপরে:
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 /
for key, value in sorted(mydict.items())"
থেকে পাইথন এর 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)])
reverse=True
উদাঃOrderedDict(sorted(d.items(), reverse=True, key=lambda t: t[0]))
Unexpected type(s): (List[str]) Possible types: (Mapping) (Iterable[Tuple[Any, Any]])
পাইথন মডিউলগুলির একটি সংখ্যা রয়েছে যা অভিধান প্রয়োগগুলি সরবরাহ করে যা স্বয়ংক্রিয়ভাবে সাজানো ক্রমে কীগুলি বজায় রাখে। খাঁটি-পাইথন এবং দ্রুত-সি-সি বাস্তবায়নের জন্য সাজানো কন্টেইনার মডিউলটি বিবেচনা করুন । এখানে একটা হল কর্মক্ষমতা তুলনা অন্যান্য জনপ্রিয় অপশন পরস্পর বিরুদ্ধে 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])
কেবল:
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
sd
অভিধান নয়, টিপলগুলির একটি তালিকা। (যদিও এখনও দরকারী।)
অন্যরা যেমন উল্লেখ করেছে, অভিধানগুলি অন্তর্নিহিতভাবে সীমান্তহীন। তবে, যদি ইস্যুটি কেবল অর্ডার করা ফ্যাশনে অভিধানগুলি প্রদর্শন করে তবে __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
পাইথন কনসোলে প্রদর্শিত হবে বা কীভাবে প্রদর্শন করবে।
অন্য একটি উপায় পাওয়া গেছে:
import json
print json.dumps(d, sort_keys = True)
আপডেট:
১. এটি নেস্টেড অবজেক্টগুলিও বাছাই করে (ধন্যবাদ @ ড্যানিয়েলএফ)।
২. পাইথন অভিধানগুলি আনঅর্ডারড তাই এটি মুদ্রণের জন্য উপযুক্ত বা কেবল স্ট্রিংকে নির্ধারিত।
পাইথন 3 এ।
>>> D1 = {2:3, 1:89, 4:5, 3:0}
>>> for key in sorted(D1):
print (key, D1[key])
দেয়
1 89
2 3
3 0
4 5
পাইথন ৩.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
কী ব্যবহার করে পাইথন ডিকটি বাছাই করার জন্য আমি এখানে কিছু সহজ সমাধান পেয়েছি 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}
একটি অভিধান বাছাই করার একটি সহজ উপায় আছে।
আপনার প্রশ্ন অনুসারে,
সমাধানটি হ'ল:
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 এটি সাহায্য করে!
আপনি যা চান ঠিক তা তৈরি করবে:
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]))
আমি মনে করি সবচেয়ে সহজতম জিনিসটি হ'ল কীটি দ্বারা ডিকটি বাছাই করা এবং সাজানো কীটি সংরক্ষণ করুন: একটি নতুন ডিকের মধ্যে মান জোড়া 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
আপনার প্রশ্ন অনুসারে আপনি বর্তমান অভিধানটি কী দ্বারা বাছাই করে একটি নতুন অভিধান তৈরি করতে পারেন।
এটি আপনার অভিধান
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} হওয়া উচিত, ডি-র কীগুলির উপর ভিত্তি করে সাজানো।
পাইথন ডিক্টগুলি আন-অর্ডারযুক্ত। সাধারণত, এটি কোনও সমস্যা নয় যেহেতু সর্বাধিক সাধারণ ব্যবহারের ক্ষেত্রে হ'ল লুক করা।
আপনি যা চান তা করার সহজ উপায় 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())]
for k,value in sorted(d.items()):
আরও ভাল: লুপের মধ্যে আবার কী দিয়ে ডিকটি অ্যাক্সেস করা এড়ানো
আমি একক লাইন ডেক বাছাই সঙ্গে আসা।
>> 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]
আশা করি এটি সহায়ক হবে।
এই ফাংশনটি কোনও অভিধানকে এর কী দ্বারা পুনরাবৃত্তভাবে সাজান 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)
ছেলেরা আপনি জিনিসগুলিকে জটিল করে তুলছেন ... এটি সত্যিই সহজ
from pprint import pprint
Dict={'B':1,'A':2,'C':3}
pprint(Dict)
আউটপুটটি হ'ল:
{'A':2,'B':1,'C':3}
সবচেয়ে সহজ সমাধানটি হ'ল ডিক কী-এর একটি তালিকা পাওয়া উচিত যাতে সাজানো ক্রম থাকে এবং তারপরে ডিকের উপর পুনরাবৃত্তি হয়। উদাহরণ স্বরূপ
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
২.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
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)
dictionary = {1:[2],2:[],5:[4,5],4:[5],3:[1]}
temp=sorted(dictionary)
sorted_dict = dict([(k,dictionary[k]) for i,k in enumerate(temp)])
sorted_dict:
{1: [2], 2: [], 3: [1], 4: [5], 5: [4, 5]}
বা ব্যবহার করুন pandas
,
ডেমো:
>>> d={'B':1,'A':2,'C':3}
>>> df=pd.DataFrame(d,index=[0]).sort_index(axis=1)
A B C
0 2 1 3
>>> df.to_dict('int')[0]
{'A': 2, 'B': 1, 'C': 3}
>>>
দেখা:
আমার পরামর্শটি হ'ল এটি আপনাকে আইটেম যুক্ত করার সাথে সাথে ডিক বাছাই করতে বা ডিকটিকে বাছাই করতে দেয় এবং ভবিষ্যতে আইটেম যুক্ত করার প্রয়োজন হতে পারে:
গঠন করুন dict
আপনি পাশাপাশি যেতে শুরু থেকেআপনার কীগুলির তালিকা সহ একটি দ্বিতীয় ডেটা কাঠামো, একটি তালিকা রয়েছে। দ্বিখণ্ডিত প্যাকেজের একটি ইনসোর্ট ফাংশন রয়েছে যা একটি সাজানো তালিকায় সন্নিবেশ করতে দেয়, বা আপনার ডিককে সম্পূর্ণরূপে পপুলেশন করার পরে আপনার তালিকাটিকে বাছাই করে। এখন, আপনি যখন আপনার ডিকটি নিয়ে পুনরাবৃত্তি করবেন, আপনি ডকের কাঠামোর প্রতিনিধিত্ব (যা বাছাইয়ের জন্য তৈরি করা হয়নি) উদ্বিগ্ন না হয়ে অর্ডার ফ্যাশনে প্রতিটি কী অ্যাক্সেসের জন্য তালিকার উপরে পুনরাবৃত্তি করুন।
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)