我有以下字典和列表 - 如何将b == '1'
作为变量从列表中传递时,如何循环检查字典?'1'
?
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 :(得分:4)
这是使用Books:where('printings.publishers', '=', $id);
的一般解决方案;内置方法,您必须根据自己的需要采用它:
filter
只有在Python3中才需要使用>>> list(filter(lambda d: d['b'] in lst, dic['info']))
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]
构造函数将filter
对象转换为列表,而在Python2中,它不是必需的:
list
编辑:如果>>> filter(lambda d: d['b'] in lst, dic['info'])
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]
中有多个项目,请使解决方案更加通用,请考虑以下事项:
lst
OR:
>>> 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'}]
答案 1 :(得分:2)
只是一个简单的列表理解:
a
答案 2 :(得分:1)
您可以使用filter
方法:
filter(lambda x:x['b'] in list, dic['info'])
它将创建一个生成器,您可以在列表中实现:
result = list(filter(lambda x:x['b'] in list, dic['info']))
请注意,我会重命名您的list
变量,因为您在此处覆盖了对list
类型的引用。
答案 3 :(得分: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'}]
构建索引dict以避免再次迭代。
答案 4 :(得分:0)
首先转到我的简单循环和迭代方式
<强>输入:强>
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
结果的新列表变量。
>>> result = []
<强> ALGO 强>
通过iteritems
字典方法迭代词汇。
主词典的值是list
数据类型。所以再次通过for循环遍历列表。
检查子词典中是否存在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的反向关键字
阅读字典和列表中具有属性的基本内容。
首先尝试编写代码。
答案 5 :(得分: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}]