4

通常我dict使用以下方法访问密钥keys()

d = {'a':1, 'b':2, 'c':3}

for k in d.keys(): print k

但有时我会看到这段代码:

for k in d: print k

这段代码正确吗?安全的?

4

4 回答 4

11

要回答您的明确问题,是的,它是安全的。

要回答您不知道的问题:

在 python 2.x 中:dict.keys()返回键列表。

但是做for k in dict迭代它们。

迭代比构造列表更快。

在 python 3+ 中,显式调用dict.keys()并不慢,因为它还返回一个迭代器。

大多数字典需求通常可以通过以下方式迭代items()而不是按键来解决:

for k, v in dict.items():
    # k is the key
    # v is the value
    print '%s: %s' % (k, v)
于 2013-02-06T13:45:35.520 回答
4

虽然这已经提到过,但我想在这些讨论中添加一些确切的数字。所以我比较了:

def iter_dtest(dtest):
    for i in dtest:
        pass

def list_dtest(dtest):
    for i in dtest.keys():
        pass

使用了包含 1 000 000 个项目的字典(浮动键),我使用timeit了 100 次重复。这些是结果:

Python 2.7.1:
iter_dtest: 3.92487884435s
list_dtest: 6.24848171448s

Python 3.2.1:
iter_dtest: 3.4850587113842555s
list_dtest: 3.535072302413432s

显然调用dtest.keys()在 Python 2.x 中有一些缺点

于 2013-02-06T14:12:48.287 回答
3

第二个代码示例的行为等同于调用.keys(),所以是的,这是正确且安全的。

于 2013-02-06T13:39:52.653 回答
0

这是不一样的。

for k in d: print k

不创建额外的列表,而

for k in d.keys(): print k

创建另一个列表,然后对其进行迭代

至少在 Python 2 中。在 Python 3dict.keys()中是一个迭代器。

因此,您可以使用for k in d.iterkeys()for k in d。两者都导致相同的结果。

于 2013-02-06T13:45:19.477 回答