【问题标题】:OrderedDictionary.popitem() unable to iterate over all values?OrderedDictionary.popitem() 无法遍历所有值?
【发布时间】:2013-08-14 17:56:17
【问题描述】:

我尝试按后进先出的顺序遍历有序字典。 虽然对于标准字典一切正常,但对于 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

【问题讨论】:

  • 如果订单很重要并且您需要这种行为,那么最好使用deque,您可以在O(1) 时间从任一端弹出。

标签: python python-2.7 dictionary ordereddictionary


【解决方案1】:

d.popitems() 将只返回一个元组 (k,v)。所以你的 for 循环正在迭代一个项目并且循环结束。

你可以试试

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

【讨论】:

    【解决方案2】:

    dict.popitem()dict.iteritems()相同;它将 one 对作为元组从字典中删除,并且您正在循环该对。

    最有效的方法是使用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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 2017-09-07
      相关资源
      最近更新 更多