OrderedDictionary.popitem()无法迭代所有值?

时间:2013-08-13 07:57:57

标签: python python-2.7 dictionary ordereddictionary

我尝试以先到先后的顺序迭代一个有序字典。 虽然对于标准字典一切正常,但orderedDict的第一个解决方案反应奇怪。似乎,虽然popitem()返回一个键/值对(但不知何故顺序,因为我不能用两个变量替换kv_pair),然后迭代完成。我认为没有简单的方法可以继续下一个键/值对。

虽然我发现了两种工作方式(如下所示),但它们都缺乏正常字典方法的优雅。

从我在在线帮助中找到的内容来看,我们无法做出决定,但我认为我有错误的期望。有更优雅的方法吗?

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

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

d.popitems()将只返回一个元组(k,v)。所以你的for循环遍历一个项目,循环结束。

你可以尝试

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