逆字典映射的性能
Performance of inverse dictionary mapping
用 value == 3
获取所有字典项并创建新字典的最有效方法是什么?
这是我目前的情况:
d = {1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, ...}
new_d = {}
for item in d:
if d[item] == 3:
new_d[item] = d[item]
有没有更有效、更简单的方法来做到这一点?也许使用地图?
你可以使用 dict comprehension:
new_d = {k:v for k, v in d.items() if v == 3}
请注意,您应该在 Python 2.x 中调用 d.iteritems()
以避免创建不必要的列表。
从下面的 timeit.timeit
测试可以看出,此解决方案更有效:
>>> from timeit import timeit
>>> d = {1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}
>>>
>>> timeit('''
... new_d = {}
... for item in d:
... if d[item] == 1:
... new_d[item] = d[item]
... ''', 'from __main__ import d')
5.002458692375711
>>>
>>> timeit('new_d = {k:v for k, v in d.items() if v == 1}', 'from __main__ import d')
4.844044424640543
>>>
也简单了很多,总是好的。
用 value == 3
获取所有字典项并创建新字典的最有效方法是什么?
这是我目前的情况:
d = {1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1, ...}
new_d = {}
for item in d:
if d[item] == 3:
new_d[item] = d[item]
有没有更有效、更简单的方法来做到这一点?也许使用地图?
你可以使用 dict comprehension:
new_d = {k:v for k, v in d.items() if v == 3}
请注意,您应该在 Python 2.x 中调用 d.iteritems()
以避免创建不必要的列表。
从下面的 timeit.timeit
测试可以看出,此解决方案更有效:
>>> from timeit import timeit
>>> d = {1: 2, 2: 2, 3: 1, 4: 1, 5: 1, 6: 1, 7: 1, 8: 1}
>>>
>>> timeit('''
... new_d = {}
... for item in d:
... if d[item] == 1:
... new_d[item] = d[item]
... ''', 'from __main__ import d')
5.002458692375711
>>>
>>> timeit('new_d = {k:v for k, v in d.items() if v == 1}', 'from __main__ import d')
4.844044424640543
>>>
也简单了很多,总是好的。