如何*懒惰*迭代OrderedDict中键的反向顺序?

时间:2017-03-20 04:58:53

标签: python dictionary ordereddictionary

我想以相反的顺序迭代OrderedDict

即。颠倒顺序:

for k, v in my_ordered_dict.iteritems():
   # < do stuff >

到目前为止,我通过撤消列表得到了一个非懒惰的版本:

for k, v in list(my_ordered_dict.iteritems())[::-1]:
   # < do stuff >

任何想法如何让它变得更好?

2 个答案:

答案 0 :(得分:6)

如果你在dict上使用reversed,它应该懒惰地评估:

for k, v in ((k, my_ordered_dict[k]) for k in reversed(my_ordered_dict)):
    .....

这是如何运作的?

这里的关键元素是generator expression,它会被懒惰地评估。因此,这将懒惰地评估有序字典的键,然后在需要时返回密钥的tupledict值。

我只需要支持python 3:

在python 3中,dict.items()现在是一个视图,并且被懒惰地评估。因此,上述内容可以简化为:

for k, v in reversed(my_ordered_dict.items()):

虽然Python 2.7确实有viewitems()方法,但Python 2.7 OrderedDict视图不支持__reversed__ reversed需要反转非序列的钩子。

答案 1 :(得分:-2)

您可以在值范围内,然后从值的数量中减去。

items = my_ordered_dict.iteritems()
max_index = len(items)

for i in range(max_index):
    object = items[max_index - i - 1]