6

这是一个基本上进行迭代的示例代码。

>>> d = {'lol': {'12': '3',  '35':''}, 'w': {'12': '3', '35':''}}

>>> def iteritems(s):
...     keys = s.keys()
...     for key in keys:
...             yield key, s[key]
... 
>>> for k, v in iteritems(d):
...     print k, v
... 
w {'12': '3', '35': ''}
lol {'12': '3', '35': ''}

这是一个有效的生成器。但是生成器iteritems必须调用s.keys()缓存字典中的所有键。如果字典很大(超过 100 个项目),则内存效率不高。

但由于字典不是有序结构,我认为获取该键列表是必须的。

有人可能会争辩说:键的数量远远少于计算键和值的项目数。

有什么建议吗?或者更好的方法(当然我需要支持嵌套迭代,但这是另一回事)。

4

3 回答 3

11

.iterkeys()在 python 2.x 中使用;在 python 3.x 中,.keys()是一个视图而不是一个新列表。在 python 2.7 中,你也可以使用viewkeys()方法来获得相同的东西。

有一个等效的.iteritems()方法,使您的实用程序方法变得多余。:-) 同样的注释适用于 python 3.x 和 2.7,请参阅提供的文档。

于 2012-09-04T19:57:43.523 回答
3

您正在重新发明轮子,以避免在 Python 2.x 中制作中间列表,只需使用:

for k, v in d.iteritems():
    print k, v

在 Python 3.x 中使用:

for k, v in d.items():
    print(k, v)

因为该.items()版本中的方法返回一个可迭代的视图对象。

于 2012-09-05T01:42:00.490 回答
0

这是使用生成器生成键/值对的另一种方法:

my_dictionary = {
    'foo': [
        1, 2, 3
    ],
    'bar': [
        4, 5, 5
    ]
}

key_values = ((key, value) for key, value in my_dictionary.items())
for key, value in key_values:
    print(key, value)

# foo [1, 2, 3]
# bar [4, 5, 6]
于 2021-10-01T22:55:11.597 回答