2011-11-29 67 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()))