2008-09-10 28 views
11

Listelerden farklı sözlükler sipariş edilmez (ve 'sort' özelliğine sahip değildir). Bu nedenle, ilk eklendiğinde öğeleri aynı sırayla almanıza güvenemezsiniz.Python'da, sıralı öğeleri bir sözlükten nasıl kolayca alabilirsiniz?

Anahtar değeri olan bir dizgeyi anahtar değeri olarak çevirip anahtar olarak artan düzende almanın en kolay yolu nedir?

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

Ben anahtar göre sınıflandırılmaktadır aşağıdaki sırayla ilişkili değerleri yazdırmak istediğiniz:

this is a 
this is b 
this is c 

cevap

1

Bu parçacık bunu yapacağız

Örneğin, bu vardı. Sık sık yapacaksanız, gözlerde daha kolay hale getirmek için bir 'sortkeys' yöntemi veya somesuch yapmak isteyebilirsiniz.

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

Düzenleme: dF'nin çözümü daha iyi - sıralanmış() öğeyi unuttum.

+0

Evet, ama sıralanmış eski piton (önceden 2.4) mevcut değildir, bu nedenle bu deyim hala işe yarar. – jmanning2k

16

Anahtarın değerine göre sıralanmış değerlere ihtiyacınız olduğu anlamına mı geliyor? Bu durumda , bunu yapmak gerekir:

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

DÜZENLEME: değişti sıralanmış (d.keys()), teşekkür Eli yerine (d) sıralanmış kullanmak için!

+1

Aslında sadece "d.keys()" ifadesini kullanmadan "sıralanmış" (d) anahtar için "diyebilirsiniz, çünkü bir sözcük üzerinde yinelenen anahtarlar üzerinde yineleniyor. –

16

Veya daha kısa,

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

sadece sıralı değil - aramaları önler –

+0

tam olarak ne demek "aramaları önler"? daha iyi performansa neden olur mu? –

+1

@Ray: evet, for döngüsündeki "anahtar, değer" ifadesini kullanarak, sözlükteki her öğe için d [anahtar] karma tablosunu aramayı önler. Yukarıdaki çözümün daha hızlı olacağına inanıyorum, ancak sisteminizde ve veri setinizde bunu ölçmek için bunu ölçmek zorunda kalacaksınız. –

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

Ayrıca değerine göre bir sözlük sıralamak ve sıralama düzenini kontrol edebilir:

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 

Çıktı: Bu b
bir bu c 2
yerine "sipariş" nin "kriteri"

0

1 Do you mean olduğunu? Sorunuz, bir sözlük sıralamayı ve sipariş etmeyi amaçlamıyor gibi görünüyor. "Sipariş verildiği" anlamına gelirseniz, koleksiyon modülünden bir OrderedDict kullanabilirsiniz.

from collections import OrderedDict 

Referans bilgileri: O sözlükleri anahtar/değer çiftleri girildi sırayı hatırlıyorum https://docs.python.org/2/library/collections.html#collections.OrderedDict