更好的单行翻转键和字典值

时间:2013-01-02 23:51:39

标签: python

我写了一个单行来完成这个:

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

任何人都可以写一个更易于理解/直接的吗?

3 个答案:

答案 0 :(得分:14)

可读且简短的dict comprehension可能是最好的:

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

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

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

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

答案 1 :(得分:2)

试试这个单行:dict(map(reversed, table.items()))

答案 2 :(得分:2)

性能+可读性

考虑到时间性能,dictionary comprehension是最佳解决方案。它既可读又具有高性能。

给定一个字典a,定义为

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

实现以下列方式执行:

原始

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

Gareth Latty' s answer

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

Noctis Skytower' s answer

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

使用Gareth Latty方法修改answer .iteritems()

If using < Python 3, .iteritems() will perform slightly faster and is more memory efficient

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