如何循环字典并检查Python中变量传递的值
我有下面的字典和列表-当从列表中作为变量传递如何循环字典并检查Python中变量传递的值,python,list,dictionary,for-loop,Python,List,Dictionary,For Loop,我有下面的字典和列表-当从列表中作为变量传递'1'时,如何循环检查字典是否b=='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'}只是一个简单的列表理解: In [22]: dic = {'info': [{'a':0, 'b':'1'},{'a':0, 'b':'3'}
'1'
时,如何循环检查字典是否b=='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'}
只是一个简单的列表理解:
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'}]
这是使用
过滤器的通用解决方案
;内置方法,您必须根据自己的需要采用:
>>> list(filter(lambda d: d['b'] in lst, dic['info']))
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]
只有在Python3中才需要使用list
构造函数将filter
对象转换为列表,而在Python2中则不需要:
>>> filter(lambda d: d['b'] in lst, dic['info'])
[{'b': '1', 'a': 0}, {'b': '1', 'a': 0}]
<>编辑:为了使解决方案更通用,在>>> 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'}]
或:
您可以使用
过滤器方法:
filter(lambda x:x['b'] in list, dic['info'])
它将创建一个生成器,可以在列表中具体化:
result = list(filter(lambda x:x['b'] in list, dic['info']))
但是请注意,我会重命名列表
变量,因为您在这里重写了对列表
类型的引用
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)
输出:
在:
输出:
构建索引dict以避免再次迭代。首先使用我的简单循环和迭代方式
输入:
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
>>> 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'}]
>>>
结果的新列表变量。
>>> result = []
算法
通过字典的iteritems
方法迭代字典
主字典的值是list
数据类型。所以再次迭代list by for循环
检查b
键是否存在于子字典中,并检查其值是否存在于给定列表l
如果是,则将附加到结果列表中
代码:
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
>>> 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'}]
>>>
输出:
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
>>> 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'}]
>>>
注意事项:
>>> dic
{'info': [{'a': 0, 'b': '1'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '3'}, {'a': 0, 'b': '1'}]}
>>> l
['1']
>>> 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的反向关键字
阅读字典的基本内容,列出有属性的内容
试着先写代码
您可以使用列表理解,也可以使用过滤器
列表理解
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的答案就是最好的。我想知道为什么它被否决了……我认为OP可能想提供一个b
s的列表,所以也许测试应该是lst
中的sub_dict['b')?你可以添加d[list[0]]
完成OP的请求。1)我使用了列表,因此看起来很清楚-上面只是示例2)我阅读了基本内容3)尝试过,但想避免使用我开始使用的嵌套循环。我相信这正是我想要的-没有嵌套循环。我会先试试这个方法。@Always_Hungy,当然,让我知道它是如何工作的!请解释一下这个代码,如果有的话(lst中x的x==sub_d['b'])?我的理解是:如果作为键b的字典元素(sub_d)的任何元素x等于列表lst中的任何元素?它检查列表lst中的any
elementx
是否等于sub_d['b']
。