繁体   English   中英

Python使用理解来整合字典键和值

[英]Python consolidate dictionary keys and values using comprehension

如何使用python COMPREHENSION整合以下内容

FROM(dicts列表)

[
 {'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(以元组为键的dicts列表和'server#'列表作为值

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

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

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'])

有关defaultdict文档(与setdefault

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

由于积累效应,很难用列表理解来实现。 但是,可以在按键排序的列表上使用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方法不需要排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM