2013-05-27 20 views
52

Załóżmy, że mam dykt.sortowanie według wartości python

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

I chcę, aby posortować dane według 'b' i 'a' więc uzyskać wynik

'a','b' 

Jak mam to zrobić?
Jakieś pomysły?

+5

możliwy duplikat [sortowania wartości słownika Pythona] (http: //stackoverflow.com/questions/6046049/python-dictionary-values-sorting) –

+0

możliwy duplikat [Jak sortować słowniki według kluczy w Pythonie] (http://stackoverflow.com/questions/4642501/how-to-sort -dictionaries-by-keys-in-python) – njzk2

+2

możliwy duplikat http://stackoverflow.com/questions/613183/python-sort-a-dictionary-by-value Spójrz na to: http: // stackoverflow. com/questions/613183/python-sort-a-dictionary-by-value/4215710 # 4215710 – jimifiki

Odpowiedz

127

Aby uzyskać wartości użyć

sorted(data.values()) 

Aby otrzymać klucze pasujące użyj key funkcję

sorted(data, key=data.get) 

Aby uzyskać listę krotek uszeregowane według wartości

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

Powiązana : patrz dyskusja tutaj: Dictionaries are ordered in Python 3.6+

+0

Ok, przepraszam. Chodziło mi o to, aby uzyskać (2: "a", 1: "b") ... jakieś pomysły? – kingRauk

+1

@kingRauk, dict's są nieuporządkowane, ale możesz zrobić uporządkowaną listę krotek –

+0

posortowanych (data.items(), klucz = lambda x: x [1], odwrotnie = True) dla reveresed order – Mannu

7

Uporządkuj wartości:

sorted(data.values()) 

powraca

['a','b'] 
4

Myślę też ważne jest, aby pamiętać, że Python dict typ obiektu znajduje się tabela hash (more on this here), a zatem nie jest zdolny do bycia posortowane bez konwersji jego kluczy/wartości na listy. To, co to pozwala, to pobranie pozycji w stałym czasie O(1), bez względu na rozmiar/liczbę elementów w słowniku.

Mimo, że kiedyś uporządkować swoje klucze - sorted(data.keys()) lub wartości - sorted(data.values()) można następnie użyć tej listy, aby uzyskać dostęp do kluczy/wartości w wzorców projektowych, takich jak te:

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 

Nadzieja to pomaga.

+3

'posortowane (słownik)' jest lepszy niż "posortowane (dictionary.keys())" – jamylak

+0

@jamylak dzięki za sugestię, ale zastanawiam się, czy zachowuje się w innym schemacie, co zrobiłaby funkcja '.keys()'? –

+1

Jest semantycznie równoważne, ale szybsze i bardziej idiomatyczne – jamylak

29

Jeśli rzeczywiście chcesz posortować słownika zamiast po prostu uzyskiwania lista posortowana używać 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'] 
+0

Smutne jest to, że w Pythonie 2.6.5 ... nie obsługuje OrderedDict – kingRauk

+5

@kingRauk, następnie nie taguj swojego pytania Python 2.7 .... Również wiele rzeczy wspomniałeś w komentarzach powinno być w twoim pytaniu na początek – jamylak

+0

Tak, przepraszam za to ... – kingRauk

14

ze swojego komentarza do gnibbler odpowiedź, powiedziałbym chcesz listę par klucz-wartość posortowane według wartości:

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

Dzięki za wszystkie odpowiedzi. Jesteś wszyscy moi bohaterowie ;-)

Czy w końcu coś takiego:

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

for id in d: 
    text = data[id] 
1

w komentarzu w odpowiedzi na Jana, sugerują, że chcesz klucze i wartości słownika, nie tylko wartości.

PEP 256 proponuje to do sortowania słownika według wartości.

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

Jeśli chcesz kolejności malejącej, to zrobić

sorted(d.iteritems(), key=itemgetter(1), reverse=True) 
0

żadna metoda lambda

# 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

Można utworzonych posortowana lista z wartości i odbudować słownika:

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 

Wyjście: newDict ionary = {'jeden': '1', 'two': '2', '1four': '4', 'five': '5'}

Powiązane problemy