2011-11-29 64 views
29

说我有一本字典,像这样:切换键和值在字典中的蟒蛇

my_dict = {2:3, 5:6, 8:9} 

有没有一种方法,我可以切换键和值来获得:

{3:2, 6:5, 9:8} 
+0

是价值独特之处?这些值是否可排除? – wim

回答

48
my_dict2 = dict((y,x) for x,y in my_dict.iteritems()) 

如果您使用python 2.7或3.x,您可以使用字典理解来代替:

my_dict2 = {y:x for x,y in my_dict.iteritems()} 

编辑

如由JBernardo的评论中指出,为Python 3.x都有你需要使用items代替iteritems

+2

'.iteritems()'在Python 3.x中是无效的... – JBernardo

+0

@JBernardo:修正了谢谢,我忘记了那个 – GWW

+0

另一个更正 - 做字典理解你建议'{(y,x)for x,y in dic_cols_w.items()}'返回一个集合,而不是一个字典。你仍然需要用'dict(...)'得到一本字典 – tsando

4

试试这个:

my_dict = {2:3, 5:6, 8:9} 

new_dict = {} 
for k, v in my_dict.items(): 
    new_dict[v] = k 
6

使用此代码(平凡修改) from Python reverse/invert a mapping

dict((v,k) for k, v in my_dict.iteritems()) 

请注意,这假设原始字典中的值是唯一的。否则,你最终会在结果字典中出现重复键,这是不允许的。

而@wim指出,它也假设这些值是可散列的。如果您不确定什么是不可排除的,请参阅the Python glossary

4

可能:

flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))

+2

这可能是不安全的,因为它依赖于键和值的排序,尽管它碰巧为我工作。 我喜欢JBernardo/GWW的回答。 – aaron

+0

使用'iterkeys'和'itervalues'可能更好。 – GWW

+0

如果字典在操作过程中没有更改,那么这很安全。我喜欢,因为你没有理解就做了。 – JBernardo

1
my_dict = { my_dict[k]:k for k in my_dict} 
2

有时,条件是值都是唯一不会举行,在这种情况下,上面的答案会破坏任何重复的值。

下卷,可能是复制成一个列表中的值:

from itertools import count 
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())]) 

我敢肯定有一个更好的(非列表-COMP)方法,但我不得不与先前的答案的一个问题,所以我认为我会提供我的解决方案,以防其他人有类似的用例。

P.S.不要指望字典在原文发生任何变化之后保持整齐排列!此方法仅在静态字典中一次性使用 - 您已被警告!

0

首先它是不是保证这是可能的,因为字典的值可能是不可能的。

如果这些都没有,我们可以使用与功能的方法:

reversed_dict = dict(map(reversed, original_dict.items()))