2016-11-28 70 views
4

我有一個字典可以有多達N個密鑰,每個密鑰都附有一個列表。我需要檢查字典中所有其他列表中的一個列表中的唯一元素。字典結構的檢查Python中的字典中的列表中的重複元素

例子:

dict = {'N1': ['e1', 'e2', ...], 'N2': ['e1', 'e3', ...], 'N...': [....], ....} 

然後我需要追加這些相同的鍵根據不同的字典,但只有在列表

return_dict = {'N1': ['e2'], 'N2': ['e3'], 'N...': [...], ...} 

我希望有獨特的元素這裏有足夠的信息來了解我在問什麼。如果有人能幫助我找到一種方法來輕鬆做到這一點,那將是非常感激。

編輯:我也不允許導入任何東西。今天沒有方便的進口。 :(

回答

1

首先,作爲一個說明,你應該避免使用dict作爲變量名,作爲陰影的內置型。

名稱現在,如果我明白你的問題,這應該怎麼辦您正在尋找:

from collections import Counter 
d = {'N1': ['e1', 'e2'], 'N2': ['e1', 'e3']} 
# Copy the dictionary if you want to keep the original one. Note in particular 
# that `return_dict = dict(d)` will not be sufficient as we need a deep copy 
return_dict = {k: list(v) for k, v in d.items()} 
# Count the occurrences of list elements 
counts = Counter([a for v in return_dict.values() for a in v]) 
# Remove elements that appear more than once 
for v in return_dict.values(): 
    for a in v: 
     if counts[a] > 1: 
      v.remove(a) 
print(d) # Prints {'N2': ['e1', 'e3'], 'N1': ['e1', 'e2']} 
print(return_dict) # Prints {'N1': ['e2'], 'N2': ['e3']} 
+0

我很抱歉,我忘了提及我不允許使用任何進口產品。這是一個很好的解決方案,否則對我有用!只需要避開沒有進口限制。 – Kezaraux

+1

僅供參考,您可以使用[複製模塊](https://docs.python.org/2/library/copy.html)複製一個字典(淺或深) – SyedElec

+0

@Kezaraux然後實現一個'計數器'。這很簡單,這個解決方案實際上是僞代碼。我們不在這裏爲你做功課。無論如何,你已經有了答案。 –

2

對於不涉及進口溶液(嘆息),我們第一個「反轉」每值上市的字典什麼列出它是:

d = {'N1': ['e1', 'e2'], 'N2': ['e1', 'e3']} 

inverse = {item: [key for key,ls in d.items() if item in ls] 
      for item in set(sum(d.values(),[])) 
      } 

在我們的案例中,inverse現在是{'e1': ['N1', 'N2'], 'e3': ['N2'], 'e2': ['N1']}。現在我們只需要再次「反轉」這本詞典,確保忽略重複:

ret = {key: [item for item in count if key in count[item] and len(count[item]) == 1] 
     for key in set(sum(count.values(),[])) 
     } 

ret然後{'N1': ['e2'], 'N2': ['e3']}


這樣做的最有趣的部分是可能的itertools.chain.from_iterablelambda x: sum(x, [])的哈克重新實現:中sum的不是很經常使用的第二個參數允許你設置一個初始值,因爲你可以「添加」列表組合在一起,這將採取一系列的名單,並建立一個新的大名單。

+0

這幾乎適用於我,唯一的問題是它看到的第一個元素,如果它實際上是重複的,它不會知道並將其視爲唯一。 – Kezaraux

+0

@Kezaraux你的意思是如果一個列表內包含重複內容?通過在'd [key]'上使用set來修復它。 – L3viathan

+0

當我運行時,我得到了我的return_dict:'{'N2':['e3','e1'],'N1':['e2']}'當我期待時:'{'N2':[ 'e3'],'N1':['e2']}'。 – Kezaraux

0

好的,從L3viathan的回答開始,我開始擺弄着類似的方法。這將是非常草率和可怕的,但它符合我的需求。我發現工作是這樣的:

ret = {} 
seen = set() 
repeated = set() 
for key in hash_dict: 
    for item in hash_dict[key]: 
     if item in seen: 
      repeated.add(item) 
     else: 
      seen.add(item) 
for key in hash_dict: 
    ret[key] = ret.get(key, []) 
    for item in hash_dict[key]: 
     if item not in repeated: 
      ret[key].append(item) 
return ret 

看起來真的馬虎給我,但因爲我沒有蟒蛇的廣泛知識,我因無法使用進口的限制,這是什麼我可以。

編輯:不同的變量名稱是這樣的,因爲我直接從我工作的項目中複製這個。

相關問題