2008-09-10 30 views
11

Słowniki w przeciwieństwie do list nie są uporządkowane (i nie mają atrybutu "sort"). Dlatego nie można polegać na otrzymywaniu przedmiotów w tej samej kolejności przy pierwszym dodaniu.W języku Python, w jaki sposób można łatwo pobrać posortowane elementy ze słownika?

Jaki jest najłatwiejszy sposób przechodzenia przez słownik zawierający ciągi znaków jako wartość klucza i pobieranie ich w porządku rosnącym według klucza?

Na przykład, trzeba było to:

d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 

Chcę drukować przynależne wartości w następującej kolejności posortowane według klucza:

this is a 
this is b 
this is c 

Odpowiedz

1

Ten fragment będzie zrobić. Jeśli masz zamiar robić to często, możesz chcieć zrobić metodę "sortkeys" lub "somesuch", aby ułatwić to w oczach.

keys = list(d.keys()) 
keys.sort() 
for key in keys: 
    print d[key] 

Edycja: rozwiązanie dF jest lepsze - zapomniałem o posortowanym().

+0

Tak, ale klasyfikowane nie jest dostępna w starszej pytona (pre 2.4), więc ten idiom jest nadal przydatny. – jmanning2k

16

Czy masz na myśli, że potrzebujesz wartości posortowanych według wartości klucza? W takim przypadku, należy to zrobić:

for key in sorted(d): 
    print d[key] 

EDIT: zmieniony wykorzystują sortowane (d) zamiast posortowanych (d.keys()), dzięki Eli!

+1

Możesz po prostu powiedzieć "dla klucza w sortowaniu (d):" bez konieczności mówienia "d.keys()", ponieważ iteracja po słowniku polega tylko na iteracji kluczy. –

16

lub krótszy,

for key, value in sorted(d.items()): 
    print value 
+0

nie tylko posortowane - unika zapytań –

+0

co dokładnie masz na myśli przez "unika poszukiwań"? czy to daje lepszą wydajność? –

+1

@Ray: tak, używając "key, value" w pętli for unika się konieczności sprawdzania tablicy hash d [key] dla każdej pozycji w słowniku. Sądzę, że powyższe rozwiązanie będzie szybsze, ale musisz go zmierzyć na swoim systemie i zestawie danych, aby mieć pewność. –

1
>>> d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 
>>> for k,v in sorted(d.items()): 
...  print v, k 
... 
this is a a 
this is b b 
this is c c 
0
d = {'b' : 'this is b', 'a': 'this is a' , 'c' : 'this is c'} 
ks = d.keys() 
ks.sort() 
for k in ks: 
    print "this is " + k 
1
for key in sorted(d): 
    print d[key] 
1

Można również sortować słownika pod względem wartości i kontrolować kolejność sortowania:

import operator 

d = {'b' : 'this is 3', 'a': 'this is 2' , 'c' : 'this is 1'} 

for key, value in sorted(d.iteritems(), key=operator.itemgetter(1), reverse=True): 
    print key, " ", value 

wyjściowa:
b to to 3
a jest to 2
c jest to 1

0

Masz na myśli "posortowany" zamiast "zamówiony"? Wygląda na to, że twoje pytanie ma na celu posortowanie słownika, a nie zamawianie go. Jeśli masz na myśli "uporządkowany", możesz użyć polecenia OrderedDict z modułu windykacji. Słowniki te zapamiętać kolejność par klucz/wartość wprowadzono: informacje

from collections import OrderedDict 

odniesienie: https://docs.python.org/2/library/collections.html#collections.OrderedDict