如何循环字典并检查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}]
<>编辑:为了使解决方案更通用,在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'}]
或:


您可以使用
过滤器
方法:

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
    element
    x
    是否等于
    sub_d['b']