通过匹配dict值,在列表中查找dict的已定义键的值

时间:2016-12-01 16:31:01

标签: python list dictionary

输入是简单的csv文件,标题如下:

dc,environment,type,component,fqdn,distribution,release
1,prod,web,fo,aa,ubuntu,14.04.5

它由csv.DictReader(csv)加载到server_list

def get_server(**kwargs):
    f = open("servers.dat", 'rt')
    try:
        reader = csv.DictReader(f)
        server_list = []
        for row in reader:
            server_list.append(row)
    finally:
        f.close()

列表包含:

{'component': 'a', 'dc': '1', 'fqdn': 'aa', 'environment': 'prod', 'release': '14.04.5', 'distribution': 'ubuntu', 'type': 'web'}
{'component': 'a', 'dc': '1', 'fqdn': 'bb', 'environment': 'prod', 'release': '14.04.5', 'distribution': 'ubuntu', 'type': 'web'}
{'component': 'b', 'dc': '1', 'fqdn': 'cc', 'environment': 'prod', 'release': '12.04.5', 'distribution': 'ubuntu', 'type': 'web'}
{'component': 'a', 'dc': '1', 'fqdn': 'dd', 'environment': 'test02', 'release': '14.04.5', 'distribution': 'ubuntu', 'type': 'web'}

我希望在输入时获得fqdn的值来自python函数的dc = 1 and component = a被称为例如get_foo(dc='1', component='a', environment=None)defined def get_foo(**kwargs)或不同。只需要结果。

因此,在这种情况下,预期结果是除第3行之外的所有这些行。

谢谢

2 个答案:

答案 0 :(得分:3)

更一般地说

def get_foo(l, **kwargs):
    return [x['fqdn'] for x in l if all(x[i] == kwargs[i] for i in kwargs)]

这会抛出一个KeyError例外,你传递的是不在字典中的关键字参数x

答案 1 :(得分:0)

您的问题表明您有一个dict的列表,如下所示:

>>> a = [{'component': 'a',
          'dc': '1',
          'distribution': 'ubuntu',
          'environment': 'prod',
          'fqdn': 'aa',
          'release': '14.04.5',
          'type': 'web'},
         {'component': 'a',
          'dc': '1',
          'distribution': 'ubuntu',
          'environment': 'prod',
          'fqdn': 'bb',
          'release': '14.04.5',
          'type': 'web'},
         {'component': 'b',
          'dc': '1',
          'distribution': 'ubuntu',
          'environment': 'prod',
          'fqdn': 'cc',
          'release': '12.04.5',
          'type': 'web'},
         {'component': 'a',
          'dc': '1',
          'distribution': 'ubuntu',
          'environment': 'test02',
          'fqdn': 'dd',
          'release': '14.04.5',
          'type': 'web'}]

您始终可以使用list comprehension语法过滤dict列表:

>>> [x['fqdn'] for x in a if x['dc'] == '1' and x['component'] == 'a']
['aa', 'bb', 'dd']

将其包装在一个函数中:

def get_foo(dlist, dc='1', component='a'):
    return [dv['fqdn'] for dv in dlist
            if dv['dc'] == dc
            and dv['component'] == component]

然后:

>>> get_foo(a)
['aa', 'bb', 'dd']