2017-05-12 5 views
-1

セットアップチェックは、その後にキーの値を割り当てる変数

私はScrapyと掻きプロジェクトに取り組んでいます。

私は文字列のリストを持って、

l = ['john', 'jim', 'jacob', … ,'jonas'] 

とリストを含む辞書、

d = { 
'names1': ['abel', 'jacob', 'poppy'], 
'names2': ['john', 'tom', 'donald'] 
} 


問題

私は中にそれぞれの名前をチェックしたいのですがのリストの1つに含まれている。もしそうなら、dのそのリストのキーを新しい変数に代入したいと思います。例えば。 jacobnewvar = names1となります。私は今のところ

found = False 
for key,value in d.items(): 
    for name in l: 
      if name == value: 
       newvar = key 
       found = True 
       break 
    else: 
     newvar = 'unknown' 
    if found: 
     break 

しかし、これはl内のすべてのnameためnewvar = 'unknown'になります。

私は外側forループを正しく破らないと思います。それ以外に、おそらく私の問題を解決するためのよりエレガントな方法はありますか?

+0

本当にこれを実行してもよろしいですか?毎回作成する新しい変数を意味します。 – Elmex80s

+0

はい、これはScrapyのスパイダーの一部です:後で辞書に 'newvar'を割り当てます。 – LucSpan

+0

'if name == value'を' if name in value'に変更することはできますか?または私はこれを間違って読んでいますか?なぜなら、私には値が好きで、リストがあり、単一の名前ではないように思えるからです。 – Marcy

答えて

0

私はあなたの問題は、lの文字列がdの値に存在するかどうかを確認したいと思っていると思います。あなたのコードは、値が文字列であり、リストではないと仮定しているので、あなたは常にfalseになる比較をしようとしているので、すべての値に "unkown"を割り当てます。以下のコードを試してみてください。

l = ['john', 'jim', 'jacob', 'jonas'] 
d = {'names1': ['abel', 'jacob', 'poppy'], 'names2': ['john', 'tom','donald']} 
found = False 
for a, b in d.items(): 
    for i in l: 
     if i in b: 
      d[a] = "unkown" 
      flag = True 
      break 

    if flag: 
    break 

print d 

これはあなたを与える:

{'names2': 'unkown', 'names1': ['abel', 'jacob', 'poppy']} 

あなたはループから抜け出すので、1つのキーだけが「不明」の値を持っていますが、あなたはすべての値を交換したい場合この文字列には不明な文字列が含まれていますが、これも同様に動作します:

final_dict = {a:"unkown" if i not in b else b for i in l for a, b in d.items()} 

print final_dict 
関連する問題