Python中两个含字典的列表跨列表字段匹配查询实现问题
实现方案
核心逻辑是先提取list2中所有Q1字段的内容,再逐个校验list1每条数据的IP、Hostname是否存在于任意一个Q1字符串中。提前提取Q1内容可以避免每次校验都重复遍历list2,数据量较大时性能优势更明显。
完整可运行代码
# 示例输入数据 list1 = [ {'ID': 0, 'IP': '192.168.1.1', 'Hostname': 'hostname1'}, {'ID': 1, 'IP': '192.168.1.2', 'Hostname': 'hostname2'}, {'ID': 2, 'IP': '192.168.1.3', 'Hostname': 'hostname3'}, {'ID': 3, 'IP': '192.168.1.4', 'Hostname': 'hostname4'} ] list2 = [ {'Q1': 'HOST_hostname9_192.168.9.0', 'Time': 'Fri, 13 Aug 2021 03:25:01 +0300'}, {'Q1': 'HOST_hostname3_192.168.9.4', 'Time': 'Tue, 17 Aug 2021 13:48:39 +0300'}, {'Q1': 'HOST_hostname7_192.168.1.2', 'Time': 'Fri, 13 Aug 2021 03:25:01 +0300'} ] # 预提取所有Q1内容 all_q1 = [item['Q1'] for item in list2] # 遍历校验输出结果 for item in list1: check_flag = any(item['IP'] in q1 or item['Hostname'] in q1 for q1 in all_q1) print(f"ID为{item['ID']}的条目结果:{'OKAY' if check_flag else 'NO'}")
运行输出
ID为0的条目结果:NO ID为1的条目结果:OKAY ID为2的条目结果:OKAY ID为3的条目结果:NO
如果只需要生成结果列表不需要打印,也可以直接用列表推导式实现:
res = ["OKAY" if any(i['IP'] in q or i['Hostname'] in q for q in all_q1) else "NO" for i in list1]
内容的提问来源于stack exchange,提问作者snorlax
相关产品推荐
相关产品推荐

