Python 比较和组合听写

Python 比较和组合听写,python,Python,我有一个清单,里面有各种各样的字典 我需要循环输入中的每个字典,并比较键值“s\u source\u zone”“s\u destination\u zone”和“Services”。如果这些键值匹配,我需要将它们(键源IP和目标IP)组合到存储在结果[]中的一个字典中。如果它们不匹配,则需要将输入字典添加到结果中 本质上是将所有“匹配”词典合并为一个。参见下面的示例 result = [] input_ = [{'s_logical_system': 'logical_1',

我有一个清单,里面有各种各样的字典

我需要循环输入中的每个字典,并比较键值“s\u source\u zone”“s\u destination\u zone”和“Services”。如果这些键值匹配,我需要将它们(键源IP和目标IP)组合到存储在结果[]中的一个字典中。如果它们不匹配,则需要将输入字典添加到结果中

本质上是将所有“匹配”词典合并为一个。参见下面的示例

    result = []
    input_ = [{'s_logical_system': 'logical_1', 's_virtual_router': 'vr_1', 's_matched_route': '10.0.0.0/8', 's_source_zone': 'zone_cccc_1', 's_destination_zone': 'zone_bbbb_1', 'Services': 80, 'Source IP': '10.10.10.10', 'Destination IP': '10.20.20.20'}, {'s_logical_system': 'logical_1', 's_virtual_router': 'vr_1', 's_matched_route': '10.0.0.0/8', 's_source_zone': 'zone_cccc_1', 's_destination_zone': 'zone_bbbb_1', 'Services': 80, 'Source IP': '10.40.10.10', 'Destination IP': '10.10.50.20'}, {'s_logical_system': 'logical_3', 's_virtual_router': 'vr_2', 's_matched_route': '10.0.0.0/8', 's_source_zone': 'zone_zzzz_1', 's_destination_zone': 'zone_rrrr_1', 'Services': 443, 'Source IP': '10.10.10.10', 'Destination IP': '10.20.20.20'}]

    if 's_source_zone', 's_destination_zone' and 'Services' all have the same values, combine the keys "Source IP" and "Destination IP" into one dictionary appended to result[]. See below;

    result = [{'s_logical_system': 'logical_1', 's_virtual_router': 'vr_1', 's_matched_route': '10.0.0.0/8', 's_source_zone': 'zone_cccc_1', 's_destination_zone': 'zone_bbbb_1', 'Services': 80, 'Source IP': '10.10.10.10, 10.40.10.10', 'Destination IP': '10.20.20.20, 10.10.50.20'}, {'s_logical_system': 'logical_3', 's_virtual_router': 'vr_2', 's_matched_route': '10.0.0.0/8', 's_source_zone': 'zone_zzzz_1', 's_destination_zone': 'zone_rrrr_1', 'Services': 443, 'Source IP': '10.10.10.10', 'Destination IP': '10.20.20.20'}]

if match not found. Append the entire dictionary to result. result.append(input_[x])
您可以通过以下方式执行此操作:

从您的示例中推断,实际上有5个键/值对需要匹配。(否则,您可能会以某种方式组合重复/相同的值,但实际情况并非如此。)


此处的lambda func匹配输入中的字典,基于它们在
match\u on
中具有5个键的等效值的交集。所有匹配的字典都被放入一个
,这是一个
itertools.\u gropper
迭代器。

你能显示预期的输出吗?@PaulRooney嗨,Paul,我不能显示信息的确切子集,但让我给你举个例子
code
input={'s_-source_-zone':'zone1','source ip':'10.0.0.1','destination ip':'10.1.1','s_-destination_-zone':'zone3'}
code
这是一个变量,其中可能有20个带有不同数据的口述,它们都位于一个列表[{}]中。预期的结果是迭代列表中的所有dict,创建一个新的列表/dict组合,并将具有相同s_源区、s_目的地区的dict组合成一个dict。希望这是清楚的。是的,我没有要求您透露任何特定信息,只是为了展示一个代表性的示例。您在
dict1、dict2、dict3
中已经有了示例输入(?),那么给定这些输入的输出是什么呢?@PaulRooney将所有具有相同“x”键值的字典组合起来。基本上,如果dict[key]==data[key]组合这两个字典。然而,它需要迭代随机数量的字典,可能是10,也可能是70。通过组合,您的意思是将所有重复的值添加到列表中?
from itertools import groupby

match_on = ['s_source_zone', 's_destination_zone', 'Services',
            's_logical_system', 's_virtual_router']
groupfunc = lambda x: [x[match] for match in match_on]

result = []
for (source, dest, service, log, virt), group in groupby(input_, groupfunc):
    group_ = tuple(group)  # otherwise iterator goes bye-bye
    res = {'Destination IP': ', '.join(d['Destination IP'] for d in group_),
           'Services': service,
           'Source IP': ', '.join(d['Source IP'] for d in group_),
           's_destination_zone': dest,
           's_logical_system': log,
           's_matched_route': ', '.join(d['s_matched_route'] for d in group_),
           's_source_zone': source,
           's_virtual_router': virt}
    result.append(res)