python - والمخرجات - موسوعة حسوب بايثون




كيف يمكنني فرز القاموس عن طريق المفتاح؟ (15)

أبسط الحلول هو أنه يجب عليك الحصول على قائمة من مفتاح dict يتم ترتيبها ثم قم بالتكرار على dict. فمثلا

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:3, 1:89, 4:5, 3:0} إلى {1:89, 2:3, 3:0, 4:5} ؟
راجعت بعض المشاركات ولكنهم جميعًا استخدموا عامل التشغيل "الذي تم فرزه" الذي يقوم بإرجاع tuples.


أعتقد أن أسهل شيء هو فرز الترتيب بواسطة المفتاح وحفظ المفتاح الذي تم فرزه: زوج القيمة في أمر جديد.

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

الرجال يعقدون الأمور معقدة ... إنها حقا بسيطة

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

الناتج هو:

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

الطريقة الأكثر إيجازًا التي لم يرد ذكرها في أي من الإجابات الأخرى هي على الأرجح هذه الطريقة:

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

بيثون ديكتس غير مرتب. عادة ، هذه ليست مشكلة حيث أن حالة الاستخدام الأكثر شيوعًا هي إجراء بحث.

إن أبسط طريقة لفعل ما تريد هو إنشاء collections.OrderedDict إدخال أمر إدخال العناصر بترتيب مفروض.

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

إذا كنت بحاجة إلى التكرار ، كما اقترح الآخرون أعلاه ، فإن أبسط طريقة هي التكرار عبر مفاتيح تم فرزها. أمثلة-

قيم الطباعة مرتبة حسب المفاتيح:

# 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.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 

في بايثون 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

قواميس بايثون القياسية غير مرتبة. حتى لو قمت بفرز أزواج (المفتاح والقيمة) ، لن تتمكن من تخزينها في أمر بطريقة تحفظ الأمر.

أسهل طريقة هي استخدام 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

بالنسبة لمستخدمي Python 3 ، يحتاج المرء إلى استخدام .items() بدلاً من .iteritems() :

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

كما ذكر آخرون ، قواميس غير مرتبة بطبيعتها. ومع ذلك ، إذا كانت المشكلة هي فقط عرض القواميس بطريقة مرتبة ، يمكنك تجاوز طريقة __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 أو في وحدة تحكم python.


لا تحتاج القواميس نفسها إلى عناصر مرتبة على هذا النحو ، إذا كنت تريد طباعتها إلخ إلى بعض الطلبات ، فإليك بعض الأمثلة:

في Python 2.4 وما فوق:

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

(بايثون أقل من 2.4 :)

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-dictionary-by-keys/


هنا وجدت بعض الحلول الأبسط لفرز pprint dict باستخدام المفتاح pprint . على سبيل المثال.

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

ولكن أثناء استخدام pprint ، فسوف تعرض الإملاء المصنّف

>>> 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

(حيث c ، هو اسم القاموس الخاص بك.)

يعطي هذا البرنامج الإخراج التالي:

[(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)]

وبالتالي من خلال تغييره إلى مفاتيح وقيم وعناصر ، يمكنك طباعة مثل ما تريده.الأمر يساعد هذا!


وجدت طريقة أخرى:

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

محدث:
1. هذا أيضا فرز الأشياء المتداخلة (شكراDanielF).
2. القواميس python غير مرتبة لذلك هذا هو sutable للطباعة أو تعيين إلى str فقط.


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]}

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)




dictionary