关于python:更好的单行翻转键和字典值

better one-liner to flip keys and values of a dictionary

我已经写了一行代码来完成这个任务:

1
vocab_tag = dict(zip(*reversed(zip(*tag_vocab.items()))))

有人能写一个更容易理解/更直接的吗?


阅读和简短的听写理解可能是最好的:

1
vocab_tage = {value: key for key, value in tag_vocab.items()}

pre 2.7,字典理解不存在,但我们可以用dict()和一个生成器表达式替换它们:

1
vocab_tage = dict((value, key) for key, value in tag_vocab.items())

值得注意的是,这假定没有具有相同值的键(与问题中的示例相同)。


性能+可读性

考虑到时间性能,词典理解是最好的解决方案。它既可读又具有性能。

给定字典,a,定义为

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

实现的执行方式如下:

原件

1
2
%%timeit
b = dict(zip(*reversed(zip(*a.items()))))
1
100000 loops, best of 3: 3.09 μs per loop

加雷斯·拉蒂的回答

1
2
%%timeit
c = {v: k for k, v in a.items()}
1
1000000 loops, best of 3: 776 ns per loop

诺提斯天空塔的回答

1
2
%%timeit
d = dict(map(reversed, a.items()))
1
100000 loops, best of 3: 4.38 μs per loop

.iteritems()方法对gareth-latty答案的修正

如果使用.iteritems()的执行速度会稍快,内存效率也会更高。

1
2
%%timeit
e = {v: k for k, v in a.iteritems()}
1
1000000 loops, best of 3: 598 ns per loop


试试这句话:dict(map(reversed, table.items()))