我尝试以先到先后的顺序迭代一个有序字典。
虽然对于标准字典一切正常,但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
答案 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()