输入是简单的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行之外的所有这些行。
谢谢
答案 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']