2017-01-13 5 views
-1

に変数で渡された値をチェックし、私は以下の辞書やリストを持っている - b == '1'場合は、リストから変数として'1'を通過する間にどのように私は辞書をループチェックするのですか?はどのように辞書をループやるとPython

dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]} 

lst = ['1'] 

返信したい{'a':0, 'b':'1'}, {'a':0, 'b':'1'}

+0

リストは常に1つのアイテムを持っているのだろうか?このアイテムは常にキー「b」の値ですか?期待される出力はリストかタプルであるはずですか? 'info'は辞書' dic'の唯一の鍵でしょうか?これらの質問に対する答えがすべて「はい」の場合、Kasramvdの回答は得られるほど良好です。 –

+0

なぜそれが下降しているのだろう... –

答えて

5

これはfilterを用いた一般的なソリューションです。内蔵の方法は、あなたのニーズにそれを採用する必要があります:

>>> list(filter(lambda d: d['b'] in lst, dic['info'])) 
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}] 

listコンストラクタを使用して、リストへfilterオブジェクトを変換Python2で、それが必要とされていないのに対し、唯一のpython3に必要です:

>>> filter(lambda d: d['b'] in lst, dic['info']) 
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}] 

EDIT:その後、次のことを考慮し、lst場合、複数の項目にはソリューションは、より一般的にするには:

>>> dic 
{'info': [{'b': '1', 'a': 0}, {'b': '3', 'a': 0}, {'b': '3', 'a': 0}, {'b': '1', 'a': 0}, {'b': '2', 'a': '1'}]} 
>>> 
>>> lst 
['1', '2'] 
>>> def filter_dict(dic_lst, lst): 
     lst_out = [] 
     for sub_d in dic_lst: 
      if any(x == sub_d['b'] for x in lst): 
       lst_out.append(sub_d) 
     return lst_out 

>>> filter_dict(dic['info'], lst) 
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}, {'b': '2', 'a': '1'}] 

OR:

>>> list(map(lambda x: list(filter(lambda d: d['b'] in x, dic['info'])),lst)) 

[[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}], [{'b': '2', 'a': '1'}]] 
+0

私はそれが私が探していたことを信じています - 入れ子にされたループはありません。まず、このアプローチを試してみましょう。 –

+0

@Always_hungry、確かに、それが行った方法を教えてください –

+0

素晴らしいです!あなたはこのコードをお願いしますか?もしあれば(x == sub_d ['b'] xは最初に)私の理解:キーbの辞書要素(sub_d)である任意の要素xがリストlstの任意の要素と等しい場合、 –

2

するだけの簡単なリスト内包:

In [22]: dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]} 

In [23]: lst = ['1'] 

In [25]: [sub_dict for sub_dict in dic['info'] if sub_dict['b'] == lst[0]] 
Out[25]: [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}] 
+0

OPはおそらく 'b'のリストを提供したいと思うので、おそらくテストは' sub_dict ['b'] in lst'でしょうか? –

1

あなたはfilterアプローチを使用することができます。

filter(lambda x:x['b'] in list, dic['info']) 

それはあなたがリストに実体化することができますジェネレータを作成します。私はしかし、あなたの名前を変更します

result = list(filter(lambda x:x['b'] in list, dic['info'])) 

マインドをここではlistタイプへの参照が上書きされているため、list変数です。アウト

1
from collections import defaultdict 
dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]} 
d = defaultdict(list) 
for each in dic['info']: 
    d[each['b']].append(each) 

defaultdict(list, 
      {'1': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}], 
      '3': [{'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}]}) 

中:

d['1'] 

アウト:

[{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}] 

再び反復を避けるために、インデックス辞書を構築します。

+1

OPの要求を完了するために 'd [list [0]]'を追加することができます。 –

0

まず、私の単純なループと繰り返しの道を行く

入力:結果のための

>>> dic 
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]} 
>>> l 
['1'] 

新規一覧変数。辞書のiteritems方法によって

>>> result = [] 

アルゴ

  1. 反復言葉遣い。

  2. メイン辞書の値は、listデータ型です。 forループを使ってリストを繰り返します。

  3. チェックbサブ辞書にキーがあり、その値が所定のリストlに存在することを確認します。

  4. 「はい」の場合、appendを結果リストに追加します。

コード:

>>> for k,v in dic.iteritems(): 
...  for i in v: 
...   if "b" in i and i["b"] in l: 
...    result.append(i) 
... 

出力:

>>> result 
[{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}] 
>>> 

注:

  1. listは変数名として使用しないでください。listはPythonのキーワードを逆にしているので、

  2. 基本的なものとプロパティを持つリストを読み込みます。

  3. 最初にコードを記述してください。

+0

1)私はリストを使用しているので、明らかに見える - 上記の例は2)私は基本的なことを読んだ3)試みたが、私が始めた入れ子にされたループを避けたかった –

+0

良いそれを保つ。 –

0

リストの理解を利用することも、フィルタを使用することもできます。

リスト内包

dict = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]} 
lst = ['1'] 
result = [i for i in dict['info'] if i['b'] == lst[0]] 

print result # [{'a': 0, 'b': '1'}, {'a': 0, 'b': '1'}] 

フィルタ

dict = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'},{'a':0, 'b':'3'},{'a':0, 'b':'1'}]} 
list(filter(lambda i: i['b'] in lst, dic['info'])) 

# [{'b': '1', 'a': 0}, {'b': '1', 'a': 0}] 
関連する問題