如何*懒惰地*迭代 OrderedDict 中键的反向顺序?
How to *lazily* iterate on reverse order of keys in OrderedDict?
我想以相反的顺序迭代 OrderedDict
。
即颠倒顺序:
for k, v in my_ordered_dict.iteritems():
# < do stuff >
到目前为止,我通过反转列表得到了一个非惰性版本:
for k, v in list(my_ordered_dict.iteritems())[::-1]:
# < do stuff >
有什么改进方法吗?
如果你在 dict 上使用 reversed
它应该延迟计算:
for k, v in ((k, my_ordered_dict[k]) for k in reversed(my_ordered_dict)):
.....
这是如何工作的?
这里的关键元素是一个 generator expression,它是惰性求值的。因此,这将延迟评估有序字典的键,然后 return 键的 tuple
和需要时的 dict
值。
我只需要支持python3:
在 python 3 中,dict.items()
现在是一个视图并且被延迟计算。因此上面可以简化为:
for k, v in reversed(my_ordered_dict.items()):
虽然 Python 2.7 确实有一个 viewitems()
方法,但 Python 2.7 OrderedDict 视图不支持 reversed
需要反转非的 __reversed__
钩子-序列。
您可以在值的范围内,然后从值的数量中减去。
items = my_ordered_dict.iteritems()
max_index = len(items)
for i in range(max_index):
object = items[max_index - i - 1]
我想以相反的顺序迭代 OrderedDict
。
即颠倒顺序:
for k, v in my_ordered_dict.iteritems():
# < do stuff >
到目前为止,我通过反转列表得到了一个非惰性版本:
for k, v in list(my_ordered_dict.iteritems())[::-1]:
# < do stuff >
有什么改进方法吗?
如果你在 dict 上使用 reversed
它应该延迟计算:
for k, v in ((k, my_ordered_dict[k]) for k in reversed(my_ordered_dict)):
.....
这是如何工作的?
这里的关键元素是一个 generator expression,它是惰性求值的。因此,这将延迟评估有序字典的键,然后 return 键的 tuple
和需要时的 dict
值。
我只需要支持python3:
在 python 3 中,dict.items()
现在是一个视图并且被延迟计算。因此上面可以简化为:
for k, v in reversed(my_ordered_dict.items()):
虽然 Python 2.7 确实有一个 viewitems()
方法,但 Python 2.7 OrderedDict 视图不支持 reversed
需要反转非的 __reversed__
钩子-序列。
您可以在值的范围内,然后从值的数量中减去。
items = my_ordered_dict.iteritems()
max_index = len(items)
for i in range(max_index):
object = items[max_index - i - 1]