сартаваць Сыроватского па значэнні пітона

Выкажам здагадку, што ў мяне ёсць Dict.

data = {1:'b', 2:'a'}

І я хачу, каб адсартаваць дадзеныя па «Коммерсанта» і «а», так што я атрымліваю вынік

'a','b'

Як я магу гэта зрабіць?
Любыя ідэі?

68
магчыма дублікат stackoverflow.com/questions/613183/& hellip; Дайце зірнуць на гэта: stackoverflow.com/questions/613183/…
дададзена аўтар jimifiki, крыніца
дададзена аўтар nawfal, крыніца
магчыма дублікат значэнняў слоўніка пітона сартавання
дададзена аўтар Ashwini Chaudhary, крыніца
дададзена аўтар njzk2, крыніца
А што, калі я хачу, спіс ключоў, адсартаваных па значэнні? Такім чынам, арыгінал будзе вяртаць [2, 1], можа быць спіс гульцоў, адсартаваных па іх ацэнках, напрыклад, адкідаючы балаў.
дададзена аўтар gseattle, крыніца
@gseattle спарадкаваныя (data.keys (), ключ = data.get)
дададзена аўтар Jennya Chang, крыніца

9 адказы

Для таго, каб атрымаць значэнне выкарыстоўваць

sorted(data.values())

Для таго, каб атрымаць ключы адпаведнасці, выкарыстоўвайце ключ функцыя

sorted(data, key=data.get)

Каб атрымаць спіс картэжаў спарадкаваны па значэнні

sorted(data.items(), key=lambda x:x[1])

Звязаны: глядзіце абмеркаванне тут: Слоўнікі ўпарадкаваны ў Python 3.6 +

147
дададзена
Добра, прабачце. Тое, што я меў на ўвазе, каб атрымаць (2: "а", 1: «б») ... любыя ідэі?
дададзена аўтар kingRauk, крыніца
@kingRauk, Dict з'яўляюцца неўпарадкаваных, але вы можаце зрабіць спарадкаваны спіс картэжаў
дададзена аўтар John La Rooy, крыніца
спарадкаваныя (data.items (), ключ = лямбда-х: х [1], зваротны = True) для таго, reveresed
дададзена аўтар Mannu, крыніца

If you actually want to sort the dictionary instead of just obtaining a sorted list use collections.OrderedDict

>>> from collections import OrderedDict
>>> from operator import itemgetter
>>> data = {1: 'b', 2: 'a'}
>>> d = OrderedDict(sorted(data.items(), key=itemgetter(1)))
>>> d
OrderedDict([(2, 'a'), (1, 'b')])
>>> d.values()
['a', 'b']
32
дададзена
Сумна тое, што ў Python 2.6.5 ... які не падтрымлівае OrderedDict
дададзена аўтар kingRauk, крыніца
Так, шкада, што ...
дададзена аўтар kingRauk, крыніца
@kingRauk тады не пазначаць пытанне Python 2.7 .... Акрамя таго, шмат рэчаў, якія вы згадвалі ў каментарах павінны быць у вашым пытанні, каб пачаць з
дададзена аўтар jamylak, крыніца
@kingRauk Ніякіх праблем, гэта ўсё добра
дададзена аўтар jamylak, крыніца

Ад ваш каментар да gnibbler адказ, я б сказаў, што вы хочаце атрымаць спіс пар ключ-значэнне адсартаваны па значэнні:

sorted(data.items(), key=lambda x:x[1])
15
дададзена

Дзякуй за ўсе адказы. Вы ўсе мае героі ;-)

Хіба ў рэшце рэшт нешта накшталт гэтага:

d = sorted(data, key = d.get)

for id in d:
    text = data[id]
7
дададзена

Сартаванне значэнняў:

sorted(data.values())

вяртаецца

['a','b']
7
дададзена

Я таксама лічу, што важна адзначыць, што Python дыктуе тып аб'екта з'яўляецца хэш-табліцы ( больш падрабязна пра гэта тут ), і, такім чынам, не можа быць адсартаваны без пераўтварэння яго ключоў/значэнняў у спісах. Тое, што гэта дазваляе гэта дыктуе здабывання элемента ў пастаянная час O (1) , незалежна ад памеру/колькасць элементаў у слоўніку.

Сказаўшы, што, як толькі вы сартавання яго ключоў - спарадкаваныя (data.keys ()) , або значэння - спарадкаваныя (data.values ​​()) , вы можаце выкарыстоўваць гэта спіс для доступу ключоў/значэнняў у шаблонах праектавання, такія як гэтыя:

for sortedKey in sorted(dictionary):
    print dictionary[sortedKeY] # gives the values sorted by key

for sortedValue in sorted(dictionary.values()):
    print sortedValue # gives the values sorted by value

Спадзяюся, што гэта дапамагае.

4
дададзена
@jamylak дзякуй за прапанову, але мне цікава, калі ён паводзіць сябе ў іншым шаблоне, то які .keys() будзе рабіць?
дададзена аўтар Morgan Wilde, крыніца
<�Код> адсартаваны (слоўнік) лепш адсартаваных (dictionary.keys ())
дададзена аўтар jamylak, крыніца
Гэта семантычны эквівалентна, але хутчэй і больш ідыёматычны
дададзена аўтар jamylak, крыніца

У вашым каментары ў адказ на Джон, вы прапануеце, што вы хочаце, ключы і значэнне слоўніка, а не толькі значэнне.

PEP 256 suggests this for sorting a dictionary by values.

import operator
sorted(d.iteritems(), key=operator.itemgetter(1))

Калі вы хочаце парадку змяншэння, зрабіце гэта

sorted(d.iteritems(), key=itemgetter(1), reverse=True)
1
дададзена

не існуе метаду лямбда

# sort dictionary by value
d = {'a1': 'fsdfds', 'g5': 'aa3432ff', 'ca':'zz23432'}
def getkeybyvalue(d,i):
    for k, v in d.items():
        if v == i:
            return (k)

sortvaluelist = sorted(d.values())
sortresult ={}
for i1 in sortvaluelist:   
    key = getkeybyvalue(d,i1)
    sortresult[key] = i1
print ('=====sort by value=====')
print (sortresult)
print ('=======================')
0
дададзена

Вы можаце сартаваць спіс створаныя з значэнняў і аднаўленне слоўніка:

myDictionary={"two":"2", "one":"1", "five":"5", "1four":"4"}

newDictionary={}

sortedList=sorted(myDictionary.values())

for sortedKey in sortedList:
    for key, value in myDictionary.items():
        if value==sortedKey:
            newDictionary[key]=value

Выхад: newDictionary = { 'адзін': '1', 'два': '2', '1four': '4', 'пяць': '5'}

0
дададзена