如何循环字典并检查Python中变量传递的值

时间:2017-01-13 12:05:55

标签: python list dictionary for-loop

我有以下字典和列表 - 如何将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'}

6 个答案:

答案 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

  1. 通过iteritems字典方法迭代词汇。

  2. 主词典的值是list数据类型。所以再次通过for循环遍历列表。

  3. 检查子词典中是否存在b密钥,并检查其值是否存在于给定列表l中。

  4. 如果是,则append到结果列表。

  5. <强>码

    >>> 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. 首先尝试编写代码。

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