我有一本字典:
d = {'a':1, 'b':2, 'c':3, 'd':4}
然后我有一个键列表:
l = ['a', 'b', 'z']
我想要的结果是:
[1, 2, None]
到目前为止我正在做的是:
[d.get(k) for k in l]
有没有更快的方法?也许没有 for
?
最佳答案
你可以使用:
>>> list(map(d.get, l))
[1, 2, None]
它有两个优点:
- 它只执行一次
d.get
查找——不是每次迭代 - Only CPython: 因为
dict.get
是用C实现的,map
是用C实现的,所以可以在函数调用中避开Python层(大致来说细节是有点复杂)。
至于计时(在 Jupyter notebook 中的 Python 3.6 上执行):
d = {'a':1, 'b':2, 'c':3, 'd':4}
l = ['a', 'b', 'z']
%timeit list(map(d.get, l))
594 ns ± 41.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
%timeit [d.get(k) for k in l]
508 ns ± 17.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
请注意,在这种情况下,这实际上更慢!这是因为对于简短的迭代器,map
和 list
开销占主导地位。因此,如果您希望它在短迭代上更快,请坚持使用您的方法。
l
越长,list(map(...))
最终变得更快:
d = {'a':1, 'b':2, 'c':3, 'd':4}
l = [random.choice(string.ascii_lowercase) for _ in range(10000)]
%timeit list(map(d.get, l))
663 µs ± 64.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit [d.get(k) for k in l]
1.13 ms ± 7.55 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
然而,这仍然“只是”快了 2 倍。
关于python - 有没有更快的方法从字典中获取多个键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49555779/