2017-05-05 2 views
-2

リスト内の項目を照合して値を含むキーを辞書から検索する必要があります。私のアプローチは、私が欲しいの出力がリスト項目がディクショナリ値に存在するかどうかを調べてキーを取得する

{'a': [1,3], 'c': 1, 'b': 3} 

ですが、私が得る上記のコードで...

{'a': [], 'c': [], 'b': []} 

は誰かがどこに説明していただけます...以下のように

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 
links = [] 
dict2 = {} 
for key, value in dict1.iteritems(): 
    for link in list1: 
     if link in dict1[key]: 
      links.append(link) 
      temp = links 
      dict2[key]=temp 
      links[:]=[] 

print dict2 

です間違っている。ここではすべてのヘルプは非常にここで

+0

'for'ループのコードが間違ってインデントされています。結果は、実際にコードをインデントする方法によって異なります。あなたの質問を更新してください。 – DyZ

答えて

4

を理解されるであろう単純な実装である:あなたのオリジナルのソリューションについては

>>> dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
>>> list1 = [1,3] 
>>> res = {} 
>>> for k, v in dict1.iteritems(): 
...  if any(i in v for i in list1): 
...   res[k] = [i for i in v if i in list1] 
... 
>>> res 
{'b': [3], 'c': [1], 'a': [1, 3]} 

、それは変数のスコープとインデントに問題があります。ここで動作するソリューションは以下のとおりです。

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 

dict2 = {} 
for key, value in dict1.iteritems(): 
    links = [] 
    for link in list1: 
     if link in dict1[key]: 
      links.append(link) 
    dict2[key] = links 

print(dict2) 
+0

Python3の 'iteritems()'を 'items()'に置き換えてください – brianpck

+0

ありがとうございます。私はこれをビルドしているクローラに適用するつもりです。効率の観点から、これは1000sのキーと値を持つ辞書を扱うためのより良いソリューションでしょうか? –

+0

彼らはほとんど同じように動作します。私の解決策は、一致する値を持たないキーを除外することです。その振る舞いを望まないのであれば、 'if any()'行を削除するだけです。 – brianpck

2

ワンライナー:

dict1 = {'a':[1,3,4], "b": [3,4,6], 'c': [88,22,1]} 
list1 = [1,3] 

res = {key : list(set(value) & set(list1)) for key, value in dict1.items()} 

set1=set(list1)は、効率のために事前に計算することができます。

+1

非常にエレガントなソリューション! – MaxU

関連する問題