使用或不使用dict.keys()访问Python dict键

mcl*_*fee 4 python dictionary loops

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

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

for k in d.keys(): print k
Run Code Online (Sandbox Code Playgroud)

但有时我看到这段代码:

for k in d: print k
Run Code Online (Sandbox Code Playgroud)

这段代码是否正确?安全?

Inb*_*ose 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)
Run Code Online (Sandbox Code Playgroud)

  • `dict.keys()`在python2.x上返回一个`list`,但不返回3.x,所以如果你在使用`for d in d`迭代它时改变dict可能会有区别,但是(在python2上) .x至少),你的字典的最终行为在迭代`d.keys()时对dict做某些操作(例如插入新元素)是确定性的. (2认同)

dmg*_*dmg 5

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

def iter_dtest(dtest):
    for i in dtest:
        pass
Run Code Online (Sandbox Code Playgroud)

def list_dtest(dtest):
    for i in dtest.keys():
        pass
Run Code Online (Sandbox Code Playgroud)

使用了包含 1 000 000 个项目的字典(浮动键),并且我使用了timeit100 次重复。结果如下:

Python 2.7.1:
iter_dtest: 3.92487884435s
list_dtest: 6.24848171448s

Python 3.2.1:
iter_dtest: 3.4850587113842555s
list_dtest: 3.535072302413432s
Run Code Online (Sandbox Code Playgroud)

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