我有一個defaultdict(列表),其中我的鍵是類型元組,我的值是元組列表。 我要扭轉這種字典和使用zip功能我已經嘗試過,這不工作扭轉默認字典
我的字典結構的樣品低於
{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
反正是有扭轉這種,所以我得到相反的鍵和值
我有一個defaultdict(列表),其中我的鍵是類型元組,我的值是元組列表。 我要扭轉這種字典和使用zip功能我已經嘗試過,這不工作扭轉默認字典
我的字典結構的樣品低於
{(2, '-', 3): [('Canada', 'Trudeau'),('Obama', 'USA')]}
反正是有扭轉這種,所以我得到相反的鍵和值
您不能這樣做,因爲您的值是可變的:[('Canada', 'Trudeau'),('Obama', 'USA')]
是一個列表,它不能是字典中的鍵。也許你可以先改變它?
除非我誤解你的「反向」(交換密鑰值,反之亦然)的意思:
注意:由於其他的答案都建議,如果你投你的列表爲一些不可改變的類型,你可以在字典中使用它們作爲鍵。
既然你有一個列表的字典,你需要使這些列表成爲一個不可變類型,用作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']})
如果你的意思是從列表中的每個元組是一個關鍵的,那麼這是很簡單(這不要緊,無論d是dict
或defaultdict
這裏)
>>> 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)}
* [你不能用鏈表做關鍵字,因爲鏈表可以用索引賦值,切片賦值進行修改(https://docs.python.org/ 2/tutorial/datastructures.html#字典)* –
另外,要警告的是,VA允許指示重複,如果您反轉字典,它可能會遇到數據丟失。 – vonPetrushev