通常我dict
使用以下方法访问密钥keys()
:
d = {'a':1, 'b':2, 'c':3}
for k in d.keys(): print k
但有时我会看到这段代码:
for k in d: print k
这段代码正确吗?安全的?
通常我dict
使用以下方法访问密钥keys()
:
d = {'a':1, 'b':2, 'c':3}
for k in d.keys(): print k
但有时我会看到这段代码:
for k in d: print k
这段代码正确吗?安全的?
要回答您的明确问题,是的,它是安全的。
要回答您不知道的问题:
在 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)
虽然这已经提到过,但我想在这些讨论中添加一些确切的数字。所以我比较了:
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 中有一些缺点
第二个代码示例的行为等同于调用.keys()
,所以是的,这是正确且安全的。
这是不一样的。
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
。两者都导致相同的结果。