簡體   English   中英

如何從字典中以相反的順序刪除重復的鍵(Python)

[英]How to remove duplicated keys in reverse order from dictionary (python)

在以下情況下,我正在努力從字典中刪除相同的鍵:

{('cat', 'tiger'): 18,
 ('tiger', 'cat'): 18,
 ('chines', 'gentleman'): 7,
 ('gentleman', 'chines'): 7}

在這種情況下,我將顛倒順序('cat', 'tiger'): 18('tiger', 'cat'): 18視為相同的鍵,並嘗試制作如下的新字典

 {('cat', 'tiger'): 18,
  ('gentleman', 'chines'): 7}

當我有一個類似的字典要合並時,我想嘗試的是適應任何逆序情況,例如{(('cage', 'cat'), 5),(('cat', 'cage'), 5)}或刪除,一個。

您可以按照以下方式進行操作:

d = {('cat', 'tiger'): 18,
     ('tiger', 'cat'): 18,
     ('chines', 'gentleman'): 7,
     ('gentleman', 'chines'): 7}

result = {tuple(sorted(x)): y for x, y in d.items()}
# {('cat', 'tiger'): 18, ('chines', 'gentleman'): 7}

在此dict理解中,每組“相等”鍵的最后遇到的值將獲勝。 對於您的樣本數據,這無關緊要,因為這些鍵具有等效值。 請注意,這也只是對元組進行排序,而不管原始dict實際出現的排序版本如何。

問題是您使用tuple值作為鍵,但是tuple對象是有序的,因此('a','b')('b','a') 一個簡單的解決方案? 使用無序但可哈希的容器,即,可使用Frozenset:

>>> data = {('cat', 'tiger'): 18,
...  ('tiger', 'cat'): 18,
...  ('chines', 'gentleman'): 7,
...  ('gentleman', 'chines'): 7}
>>>
>>> data
{('cat', 'tiger'): 18, ('tiger', 'cat'): 18, ('chines', 'gentleman'): 7, ('gentleman', 'chines'): 7}
>>> {frozenset(k):v for k,v in data.items()}
{frozenset({'cat', 'tiger'}): 18, frozenset({'gentleman', 'chines'}): 7}

如果您不關心鍵中兩個項目的順序...,並且與它們關聯的值始終相同,那么假設起始字典為old_dict ,最簡單的方法可能是:

new_dict = dict()
for (key, value) in old_dict.items():
    new_dict[tuple(sorted(key))] = value

您只需遍歷鍵/值對,然后將它們添加到new_dict 由於我們現在對鍵進行了排序,然后將結果列表返回到元組,因此,我們確保不會再出現任何一對夫婦覆蓋先前的條目。

除了從中刪除項目,您還可以隨心所欲地休息。

data={('cat', 'tiger'): 18,
 ('tiger', 'cat'): 18,
 ('chines', 'gentleman'): 7,
 ('gentleman', 'chines'): 7}


track={}
for i,j in data.items():
    track[tuple(sorted(i))]=j

print(track)

輸出:

{('cat', 'tiger'): 18, ('chines', 'gentleman'): 7}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM