我有以下字典和列表 - 我怎麼遍歷所有的字典,同時通過'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'}
。
我有以下字典和列表 - 我怎麼遍歷所有的字典,同時通過'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'}
。
這是使用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'}]]
我相信,它是我正在尋找 - 沒有嵌套循環。我會先嚐試這種方法。 –
@Always_hungry,當然,讓我知道它是如何去 –
偉大的作品!你能解釋一下這個代碼嗎(如果有的話)(x == sub_d ['b'] for x in lst)?我的理解:如果鍵b的字典元素(sub_d)的任何元素x等於列表lst中的任何元素? –
只是一個簡單的列表理解:
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'}]
我認爲OP可能想提供一個'b's的列表,所以也許測試應該''sub_dict ['b'] in lst'? –
你可以使用一個filter
方法:
filter(lambda x:x['b'] in list, dic['info'])
這將創建一個生成器,你可以在列表中兌現:
result = list(filter(lambda x:x['b'] in list, dic['info']))
意思,我不願意然而重命名list
變量,因爲您在此覆蓋對list
類型的引用。
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'}]
建立索引字典避免再次迭代。
你可以添加'd [list [0]]'來完成OP的請求。 –
第一次去我的簡單循環和迭代的方式
輸入:
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
的結果新的列表變量。
>>> result = []
ALGO
通過詞典的iteritems
方法迭代用語。
主字典的值是list
數據類型。所以再次循環迭代列表。
檢查b
密鑰存在於子字典中,並檢查其值是否在給定列表l
中。
如果是,則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'}]
>>>
注:
不要使用list
變量名,因爲list
反轉關鍵字爲Python
閱讀字典和列表,它具有以下特性基本的東西。
嘗試先寫代碼。
1)我用清單看起來很清楚 - 以上只是示例2)我閱讀基本的東西3)嘗試過但想避免嵌套的循環,我開始使用 –
好繼續保持它。 –
您可以使用列表理解,或者只是使用過濾器來完成。
列表理解
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}]
將列表中總是有一個確切的項目?這個項目是否總是一個鍵「b」的值?預期的輸出應該是列表還是元組? 'info'永遠是字典'dic'唯一的關鍵字?如果所有這些問題的答案都是肯定的,那麼Kasramvd的答案就是如此。 –
我想知道爲什麼它是downvoted ... –