已经回答了,但是由于有几个人提到了反转字典,下面是你如何在一行中做到这一点(假设 1:1 映射)和一些不同的性能数据:
python 2.6:
reversedict = dict([(value, key) for key, value in mydict.iteritems()])
2.7+:
reversedict = {value:key for key, value in mydict.iteritems()}
如果你认为不是 1:1,你仍然可以用几行创建一个合理的反向映射:
reversedict = defaultdict(list)
[reversedict[value].append(key) for key, value in mydict.iteritems()]
这有多慢:比简单的搜索要慢,但并不像您想象的那么慢 - 在“直接”100000 条目字典上,“快速”搜索(即寻找应该在早期的值键)比反转整个字典快大约 10 倍,“慢”搜索(接近结尾)大约快 4-5 倍。因此,在最多大约 10 次查找之后,它就收回了成本。
第二个版本(每个项目都有列表)大约是简单版本的 2.5 倍。
largedict = dict((x,x) for x in range(100000))
# Should be slow, has to search 90000 entries before it finds it
In [26]: %timeit largedict.keys()[largedict.values().index(90000)]
100 loops, best of 3: 4.81 ms per loop
# Should be fast, has to only search 9 entries to find it.
In [27]: %timeit largedict.keys()[largedict.values().index(9)]
100 loops, best of 3: 2.94 ms per loop
# How about using iterkeys() instead of keys()?
# These are faster, because you don't have to create the entire keys array.
# You DO have to create the entire values array - more on that later.
In [31]: %timeit islice(largedict.iterkeys(), largedict.values().index(90000))
100 loops, best of 3: 3.38 ms per loop
In [32]: %timeit islice(largedict.iterkeys(), largedict.values().index(9))
1000 loops, best of 3: 1.48 ms per loop
In [24]: %timeit reversedict = dict([(value, key) for key, value in largedict.iteritems()])
10 loops, best of 3: 22.9 ms per loop
In [23]: %%timeit
....: reversedict = defaultdict(list)
....: [reversedict[value].append(key) for key, value in largedict.iteritems()]
....:
10 loops, best of 3: 53.6 ms per loop
使用 ifilter 也有一些有趣的结果。从理论上讲,ifilter 应该更快,因为我们可以使用 itervalues() 并且可能不必创建/遍历整个值列表。在实践中,结果……很奇怪……
In [72]: %%timeit
....: myf = ifilter(lambda x: x[1] == 90000, largedict.iteritems())
....: myf.next()[0]
....:
100 loops, best of 3: 15.1 ms per loop
In [73]: %%timeit
....: myf = ifilter(lambda x: x[1] == 9, largedict.iteritems())
....: myf.next()[0]
....:
100000 loops, best of 3: 2.36 us per loop
因此,对于小偏移量,它比任何以前的版本都快得多(2.36 *u*S 与以前的情况下至少 1.48 *m*S)。但是,对于列表末尾附近的大偏移量,它的速度要慢得多(15.1ms 与相同的 1.48mS)。低端的小额节省不值得高端的成本,恕我直言。