2015-11-08 40 views
3

我有一個defaultdict(列表),其中我的鍵是類型元組,我的值是元組列表。 我要扭轉這種字典和使用zip功能我已經嘗試過,這不工作扭轉默認字典

我的字典結構的樣品低於

{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 

反正是有扭轉這種,所以我得到相反的鍵和值

+1

* [你不能用鏈表做關鍵字,因爲鏈表可以用索引賦值,切片賦值進行修改(https://docs.python.org/ 2/tutorial/datastructures.html#字典)* –

+2

另外,要警告的是,VA允許指示重複,如果您反轉字典,它可能會遇到數據丟失。 – vonPetrushev

回答

2

您不能這樣做,因爲您的值是可變的:[('Canada', 'Trudeau'),('Obama', 'USA')]是一個列表,它不能是字典中的鍵。也許你可以先改變它?

7

既然你有一個列表的字典,你需要使這些列表成爲一個不可變類型,用作Python字典中的一個鍵。

可以讓列表值的元組:

>>> di={(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 
>>> {tuple(v):k for k, v in di.items()} 
{(('Canada', 'Trudeau'), ('Obama', 'USA')): (2, '-', 3)} 

或者把它們變成字符串:

>>> {repr(v):k for k, v in di.items()} 
{"[('Canada', 'Trudeau'), ('Obama', 'USA')]": (2, '-', 3)} 

無論哪種,你可以把鑰匙放回列表中,如果需要的話:

>>> from ast import literal_eval 
>>> literal_eval("[('Canada', 'Trudeau'), ('Obama', 'USA')]") 
[('Canada', 'Trudeau'), ('Obama', 'USA')] 

>>> list((('Canada', 'Trudeau'), ('Obama', 'USA'))) 
[('Canada', 'Trudeau'), ('Obama', 'USA')] 

(順便說一句:不要使用eval如果代碼可能有任何外部字符串 - 使用當你扭轉鑰匙

di={'key 1':'val', 'key 2': 'val', 'key 3': 'val'} 

和值你將失去的數據爲「VAL」每添加一個關鍵:產品代碼在這裏的例子)

最後,考慮這個字典。

您可以使用默認字典來解決重複的值成爲鍵:

dd=defaultdict(list) 
for k, v in di.items(): 
    dd[v].append(k) 

>>> dd 
defaultdict(<type 'list'>, {'val': ['key 1', 'key 2', 'key 3']}) 
0

如果你的意思是從列表中的每個元組是一個關鍵的,那麼這是很簡單(這不要緊,無論d是dictdefaultdict這裏)

>>> D = {(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]} 
>>> {k1: k for k, v in D.items() for k1 in v} 
{('Canada', 'Trudeau'): (2, '-', 3), ('Obama', 'USA'): (2, '-', 3)}