2016-11-28 8 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

FYIでは、[copy module](https://docs.python.org/2/library/copy.html)を使用して、辞書(浅いまたは深い)をコピーすることができます。 – SyedElec

+0

@Kezarauxは、その後、「Counter」を実装します。簡単ですが、このソリューションは事実上疑似コードです。私たちはここであなたの宿題をするつもりはありません。あなたはとにかく答えがあります。 –

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']}です。


本の最も興味深い部分は、おそらくlambda x: sum(x, [])としてitertools.chain.from_iterableのハック再実装したものです:sumの非常に頻繁に使用されていない2つ目のパラメータは、あなたが開始値を設定することができます、そしてあなたが「追加」することができますして一緒に一覧表示されますので、これは一連のリストを取り、新しい大きなリストを作成します。

+0

これはほとんど私のために働く、唯一の問題は、それが実際に重複している場合、それが分からないとそれは一意であるとカウントされます、それが見ている最初の要素です。 – Kezaraux

+0

@Kezarauxリスト内に重複が含まれている場合は、 'd [key]'でsetを使うことで編集時に修正されました。 – L3viathan

+0

私は、私が期待していたときにreturn_dict: '{'N2':['e3'、 'e1']、 'N1':['e2']} '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 

は私には本当にずさんなルックスが、私のpythonの幅広い知識を持っていない、と私は輸入品を使用することができないことで制限されていますから、これは何です:私は仕事に見つかったことは、このでした私はそれをできた。

編集:異なる変数名は、私が作業していたプロジェクトから直接コピーしたものです。

関連する問題