3

如何使用 python COMPRHENSION 巩固以下内容

FROM(字典列表)

[
 {'server':'serv1','os':'Linux','archive':'/my/folder1'}
 ,{'server':'serv2','os':'Linux','archive':'/my/folder1'}
 ,{'server':'serv3','os':'Linux','archive':'/my/folder2'}
 ,{'server':'serv4','os':'AIX','archive':'/my/folder1'}
 ,{'server':'serv5','os':'AIX','archive':'/my/folder1'}
]

TO(以元组为键的字典列表和以“服务器#”为值的列表

[
 {('Linux','/my/folder1'):['serv1','serv2']}
 ,('Linux','/my/folder2'):['serv3']}
 .{('AIX','/my/folder1'):['serv4','serv5']}
]
4

2 回答 2

4

需要能够为您的字典设置默认值并多次使用相同的键可能会使 dict-comprehension 有点笨拙。我更喜欢这样的东西:

可能会有所defaultdict帮助:

from collections import defaultdict

lst = [
 {'server':'serv1','os':'Linux','archive':'/my/folder1'},
 {'server':'serv2','os':'Linux','archive':'/my/folder1'},
 {'server':'serv3','os':'Linux','archive':'/my/folder2'},
 {'server':'serv4','os':'AIX','archive':'/my/folder1'},
 {'server':'serv5','os':'AIX','archive':'/my/folder1'}
]

dct = defaultdict(list)

for d in lst:
    key = d['os'], d['archive']
    dct[key].append(d['server'])

如果您希望最后有一个标准字典(实际上我没有看到一个很好的理由),您可以使用dict.setdefault它来创建一个键尚不存在的空列表:

dct = {}

for d in lst:
    key = d['os'], d['archive']
    dct.setdefault(key, []).append(d['server'])

(vs. )上的文档defaultdictsetdefault

这种技术比使用 dict.setdefault() 的等效技术更简单、更快

于 2017-07-12T05:50:24.197 回答
1

由于累积效应,列表理解很难实现。但是,可以itertools.groupby在按您的键排序的列表上使用(key对排序和分组使用相同的功能)。

然后在列表理解中提取服务器信息并按组键作为前缀。将结果(组键、服务器列表)传递给字典理解,然后就可以了。

import itertools

lst = [
 {'server':'serv1','os':'Linux','archive':'/my/folder1'}
 ,{'server':'serv2','os':'Linux','archive':'/my/folder1'}
 ,{'server':'serv3','os':'Linux','archive':'/my/folder2'}
 ,{'server':'serv4','os':'AIX','archive':'/my/folder1'}
 ,{'server':'serv5','os':'AIX','archive':'/my/folder1'}
]


sortfunc = lambda x : (x['os'],x['archive'])

result = {k:[x['server'] for x in v] for k,v in itertools.groupby(sorted(lst,key=sortfunc),key = sortfunc)}


print(result)

我得到:

{('Linux', '/my/folder1'): ['serv1', 'serv2'], ('AIX', '/my/folder1'): ['serv4', 'serv5'], ('Linux', '/my/folder2'): ['serv3']}

请记住,并不是因为它可以写在一行中,它就更有效。例如,该defaultdict方法不需要排序。

于 2017-07-12T06:01:53.523 回答