我目前正在尝试制作一个函数来反转字典的键和值。我在网上查找并发现了这个:
def reverse(d):
return dict([(v, k) for k, v in d.iteritems()])
我的问题是我不确定这意味着什么。我理解单行 for 循环的想法,但我不确定 (v, k) for k, v 是如何导致键和值被反转的。有人可以帮我一下吗? (我确实在网上和 Stack Overflow 上搜索过这个,但找不到任何东西。)
最佳答案
for k, v in d.iteritems()
是每个 key k
和 value v
所以用 反转 v 和 k (v, k)
使旧值成为键,旧键成为新值
In [7]: d = {1:10,2:20}
In [8]: d.items()
Out[8]: dict_items([(1, 10), (2, 20)]) # tuples of key and value
In [1]: d = {1:10,2:20}
In [2]: for k,v in d.iteritems():
print k,v
...:
1 10 # 1 is the key 10 is the value
2 20
In [3]: new_d = {v:k for k,v in d.iteritems()} # swap key for value and value for key
In [4]: new_d
Out[4]: {10: 1, 20: 2}
您可能遇到的两个问题是重复值或不可散列的值,因此它们不能用作列表、集合等的键...
In [5]: d = {1:2,2:2}
In [6]: new_d = {v:k for k,v in d.iteritems()}
In [7]: new_d
Out[7]: {2: 2} # now only one key and value in the dict
In [8]: d = {1:2,2:[2]}
In [9]: new_d = {v:k for k,v in d.iteritems()}
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-9-46a3901ce850> in <module>()
----> 1 new_d = {v:k for k,v in d.iteritems()}
<ipython-input-9-46a3901ce850> in <dictcomp>((k, v))
----> 1 new_d = {v:k for k,v in d.iteritems()}
TypeError: unhashable type: 'list'
dict([(v, k) for k, v in d.iteritems()])
将具有与 {v:k for k,v in d 相同的输出。 iteritems()}
,主要区别是前者还兼容python < 2.7。
如果您使用的是 python < 2.7,则无需使用列表,您可以只使用生成器表达式:
dict((v, k) for k, v in d.iteritems())
关于python - 反转字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368782/