逆字典映射的性能

Dav*_*542 -1 python dictionary

获取所有dict项目value == 3并创建新dict 的最有效方法是什么?

这是我到目前为止:

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]
Run Code Online (Sandbox Code Playgroud)

有没有更有效,更简单的方法来做到这一点?也许使用地图?

iCo*_*dez 5

你可以使用词典理解:

new_d = {k:v for k, v in d.items() if v == 3}
Run Code Online (Sandbox Code Playgroud)

请注意,您应该d.iteritems()在Python 2.x中调用以避免创建不必要的列表.


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
>>>
Run Code Online (Sandbox Code Playgroud)

它也简单得多,总是好的.

  • 如果OP需要为多个值执行此操作,他可能需要进行逆映射:`d_inverse = {};对于k,v在d.items()中:d2.setdefault(v,[]).append(k) `.对于一个值,这将更慢,但对于多个值可能更快. (2认同)