2017-01-13 117 views
-1
傳遞的值

我有以下字典和列表 - 我怎麼遍歷所有的字典,同時通過'1'可變從列表中,如果b == '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

將列表中總是有一個確切的項目?這個項目是否總是一個鍵「b」的值?預期的輸出應該是列表還是元組? 'info'永遠是字典'dic'唯一的關鍵字?如果所有這些問題的答案都是肯定的,那麼Kasramvd的答案就是如此。 –

+0

我想知道爲什麼它是downvoted ... –

回答

5

這是使用filter一個通用的解決方案;內置的方法,你必須把它採您的需求:使用list構造僅在Python3必要

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

轉換的filter對象到列表中,而在Python2,它不是必需的:

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

編輯:使溶液在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'] for x in lst)?我的理解:如果鍵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's的列表,所以也許測試應該''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

你可以添加'd [list [0]]'來完成OP的請求。 –

0

第一次去我的簡單循環和迭代的方式

輸入:

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

的結果新的列表變量。

>>> result = [] 

ALGO

  1. 通過詞典的iteritems方法迭代用語。

  2. 主字典的值是list數據類型。所以再次循環迭代列表。

  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}]