2013-08-13 1 views
1

Я стараюсь перебирать упорядоченный словарь в последнем порядке. Хотя для стандартного словаря все работает нормально, первое решение для упорядоченногоDict реагирует странно. Кажется, что в то время как popitem() возвращает одну пару ключ/значение (но как-то последовательно, так как я не могу заменить kv_pair на две переменные), итерация завершается тогда. Я не вижу простого способа перейти к следующей паре ключ/значение.УпорядочилDictionary.popitem() не удалось перебрать все значения?

Хотя я нашел две рабочие альтернативы (см. Ниже), им не хватает элегантности обычного словарного подхода.

Из того, что я нашел в онлайн-справке, невозможно решить, но я предполагаю, что у меня неправильные ожидания. Есть ли более эльгетический подход?

from collections import OrderedDict 

normaldict = {"0": "a0.csf", "1":"b1.csf", "2":"c2.csf"} 

for k, v in normaldict.iteritems(): 
    print k,":",v 

d = OrderedDict() 
d["0"] = "a0.csf" 
d["1"] = "b1.csf" 
d["2"] = "c2.csf" 

print d, "****" 

for kv_pair in d.popitem(): 
    print kv_pair 
print "++++" 


for k in reversed(d.keys()): 
    print k, d[k] 

print "%%%%" 

while len(d) > 0: 
    k, v = d.popitem() 
    print k, v 
+0

Если бы дело порядка и вам нужно такое поведение, то лучше использовать 'deque', вы можете выскочить из любого конца в' O (1) 'времени. –

ответ

2

dict.popitem() является не то же самое, как dict.iteritems(); он удаляет одну из пары из словаря в качестве кортежа, и вы перебираете эту пару.

Наиболее эффективным методом является использование петли while; нет необходимости вызывать len(), просто тест против самого словаря, пустой словарь не считается ложным:

while d: 
    key, value = d.popitem() 
    print key, value 

Альтернатива заключается в использовании reversed():

for key, item in reversed(d.items()): 
    print key, value 

но требует весь словарь, чтобы скопировать в список в первую очередь.

Однако, если вы искали очереди FIFO, использовать collections.deque() вместо:

from collections import deque 

d = deque(["a0.csf", "b1.csf", "c2.csf"]) 

while d: 
    item = d.pop() 

или использовать deque.reverse().

0

d.popitems() вернет только один кортеж (k, v). Таким образом, ваш цикл for выполняет итерацию по одному элементу, и цикл завершается.

вы можете попробовать

while d: 
    k, v = d.popitem()