Skip to main content
 首页 » 编程设计

python之反转字典

2025年05月04日14luoye11

我目前正在尝试制作一个函数来反转字典的键和值。我在网上查找并发现了这个:

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())