Yanıtlar:
Bunu çok kapsamlı bir şekilde test etmedim, ancak Python 2.5.2'de çalışıyor.
>>> d = {"x":2, "h":15, "a":2222}
>>> it = iter(sorted(d.iteritems()))
>>> it.next()
('a', 2222)
>>> it.next()
('h', 15)
>>> it.next()
('x', 2)
>>>
for key, value in d.iteritems(): ...
Yineleyiciler yerine yapmaya alışkınsanız, bu yine de yukarıdaki çözümle çalışır
>>> d = {"x":2, "h":15, "a":2222}
>>> for key, value in sorted(d.iteritems()):
>>> print(key, value)
('a', 2222)
('h', 15)
('x', 2)
>>>
Python 3.x ile bir yineleyici döndürmek d.items()
yerine kullanın d.iteritems()
.
items()
bir liste oluşturur ve bu nedenle belleği kullanır, oysa iteritems()
esas olarak belleği kullanmaz. Ne kullanılacağı çoğunlukla sözlüğün büyüklüğüne bağlıdır. Ayrıca, Python 3 dönüştürme aracı otomatik Python 2 ( 2to3
) otomatik dönüştürme ilgilenir iteritems()
için items()
, bu yüzden bu konuda endişe etmeye gerek yoktur.
collections.OrderedDict
kez kullanın ve öğeleri her zaman sıralı düzende alın.
iteritems()
bellek kullanmasa bile , her şey için belleğe çekilmelidir sorted()
, bu nedenle bellek items()
ile iteritems()
burada kullanım arasında bir fark yoktur .
items()
items()
iteritems()
sorted()
İşlevi kullanın :
return sorted(dict.iteritems())
Sıralanan sonuçların üzerinde gerçek bir yineleyici istiyorsanız, sorted()
bir liste döndürdüğü için şunu kullanın:
return iter(sorted(dict.iteritems()))
Bir diktenin anahtarları bir hashtable içinde saklanır, böylece 'doğal düzen', yani psuedo-random. Başka herhangi bir düzen, söz konusu tüketicinin konseptidir.
sort () her zaman bir liste değil, bir liste döndürür. Eğer bir dict.items () (bu, bir tuples listesi üretir) iletirseniz, bir döngüde kullanılabilen tuples [[k1, v1), (k2, v2), ...] listesini döndürür. bir dikte gibi bir şekilde, ama yine de bir dikte değil !
foo = {
'a': 1,
'b': 2,
'c': 3,
}
print foo
>>> {'a': 1, 'c': 3, 'b': 2}
print foo.items()
>>> [('a', 1), ('c', 3), ('b', 2)]
print sorted(foo.items())
>>> [('a', 1), ('b', 2), ('c', 3)]
Aşağıdaki bir döngü içinde bir dikte gibi hissediyor, ama değil, k, v içine paketlenmiş tuples bir listesi:
for k,v in sorted(foo.items()):
print k, v
Kabaca şuna eşit:
for k in sorted(foo.keys()):
print k, foo[k]
sorted(foo.keys())
eşdeğer olarak daha iyidir sorted(foo)
, çünkü sözlükler yinelendiğinde anahtarlarını döndürürler ( foo.keys()
belki de sorted()
tekrarlanabilirler için nasıl uygulandığına bağlı olarak , ara listeyi oluşturmak zorunda kalmama avantajı ile).
k in sorted(foo.keys()):
anahtarları çeken veya for k,v in sorted(foo.items()):
sözlüğün liste çiftlerinin bir kopyasını döndüren bellek için daha iyi olduğunu merak ediyorumsorted(foo.keys())
Greg'in yanıtı doğru. Python 3.0'da şunları yapmanız gerektiğini unutmayın
sorted(dict.items())
olarak iteritems
gitmiş olacak.
Artık OrderedDict
Python 2.7'de de kullanabilirsiniz :
>>> from collections import OrderedDict
>>> d = OrderedDict([('first', 1),
... ('second', 2),
... ('third', 3)])
>>> d.items()
[('first', 1), ('second', 2), ('third', 3)]
Burada 2.7 sürümü ve OrderedDict API için yeni sayfa var .
Genel olarak bir kişi şu şekilde sıralanabilir:
for k in sorted(d):
print k, d[k]
Söz konusu özel durum için, d.iteritems () için "yedekte bir düşüş" olması gibi bir işlev ekleyin:
def sortdict(d, **opts):
# **opts so any currently supported sorted() options can be passed
for k in sorted(d, **opts):
yield k, d[k]
ve böylece bitiş çizgisi
return dict.iteritems()
için
return sortdict(dict)
veya
return sortdict(dict, reverse = True)
>>> import heapq
>>> d = {"c": 2, "b": 9, "a": 4, "d": 8}
>>> def iter_sorted(d):
keys = list(d)
heapq.heapify(keys) # Transforms to heap in O(N) time
while keys:
k = heapq.heappop(keys) # takes O(log n) time
yield (k, d[k])
>>> i = iter_sorted(d)
>>> for x in i:
print x
('a', 4)
('b', 9)
('c', 2)
('d', 8)
Bu yöntemin hala bir O (N log N) türü vardır, ancak kısa bir doğrusal yığınlamadan sonra, öğeleri listeye göre sıralı olarak verir ve her zaman tüm listeye ihtiyacınız olmadığında teorik olarak daha verimli hale getirir.
Anahtarların sırası yerine öğelerin eklenme sırasına göre sıralamak istiyorsanız, Python'un koleksiyonlarına bir göz atmanız gerekir . (Yalnızca Python 3)
sıralanmış bir liste döndürür, bu nedenle listeyi yinelemeye çalıştığınızda hata yaparsınız, ancak bir diksiyon sipariş edemediğiniz için bir listeyle uğraşmanız gerekir.
Kodunuzun daha büyük bağlamının ne olduğu hakkında hiçbir fikrim yok, ancak sonuç listesine bir yineleyici eklemeyi deneyebilirsiniz. belki böyle mi ?:
return iter(sorted(dict.iteritems()))
Tabii ki şimdi tuples geri alacaksınız çünkü sıralanmış sizin dikte tuples listesine dönüştürdü
ex: dict'inizin olduğunu söyleyin:
{'a':1,'c':3,'b':2}
sıralanmış bir listeye dönüştürür:
[('a',1),('b',2),('c',3)]
böylece listeyi gerçekten yinelediğinizde (bu örnekte) bir dize ve bir tamsayıdan oluşan bir demet alırsınız, ancak en azından listeyi yineleyebilirsiniz.
CPython 2.x kullandığınızı ve büyük bir sözlük alanına sahip olduğunuzu varsayarsak, sıralanmış (mydict) kullanmak yavaş olur çünkü sıralanmış, mydict tuşlarının sıralı bir listesini oluşturur.
Bu durumda, C'nin bir uygulamasını içeren sipariş edilen paketimize bakmak isteyebilirsiniz. sorteddict
, C'de . Özellikle de sözlüklerin yaşamının farklı aşamalarında (yani öğe sayısı) sıralanmış anahtar listesini birden çok kez gözden geçirmek zorunda kalırsanız.
.items()
yerine kullanıniteritems()
: @Claudiu'nun dediği gibi, iteritems Python 3.x için çalışmaz, ancakitems()
Python 2.6'dan edinilebilir.