理论
‘dstintf’和’srcintf’内部的数据结构不会使此问题变得更容易.字典列表几乎永远不是正确的类型.
根据您的需求,您可能应该将其转换为字典:
>>> data = [{'name': 'ZN_DMZ', 'q_origin_key': 'ZN_DMZ'},
... {'name': 'ZN_MGMT', 'q_origin_key': 'ZN_MGMT'},
... {'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
>>> {d['q_origin_key']:d['name'] for d in data}
{'ZN_AUDIT': 'ZN_AUDIT', 'ZN_MGMT': 'ZN_MGMT', 'ZN_DMZ': 'ZN_DMZ'}
但是,如果name和q_origin_key的值始终相等,则可以使用列表或集合:
>>> [d['name'] for d in data]
['ZN_DMZ', 'ZN_MGMT', 'ZN_AUDIT']
>>> {d['name'] for d in data}
set(['ZN_AUDIT', 'ZN_MGMT', 'ZN_DMZ'])
现在应该更容易过滤数据,而无需循环或ifs.
最后,dict.items()以任意顺序返回一个元组列表.
我认为dict1.items()< = dict2.items()不会对您有任何帮助.
例
将代码拆分为多个函数并使用集合可能是个好主意:
query = {'action': 'accept',
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
entry1 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
entry2 = {'action': 'accept',
'dstintf': [{'name': 'ZN_HDW', 'q_origin_key': 'ZN_HDW'}],
'srcintf': [{'name': 'ZN_DMZ', 'q_origin_key': 'ZN_DMZ'},
{'name': 'ZN_MGMT', 'q_origin_key': 'ZN_MGMT'},
{'name': 'ZN_AUDIT', 'q_origin_key': 'ZN_AUDIT'}]
}
def compare_values(value1, value2):
if isinstance(value1, list) and isinstance(value2, list):
return set(d['name'] for d in value1).issubset(set(d['name'] for d in value2))
else:
return value1 == value2
def is_a_match(query, entry):
do_not_match = [key for key in query if not compare_values(
query[key], entry.get(key))]
for key in do_not_match:
print("%r does not match" % key)
return len(do_not_match) == 0
print(is_a_match(query, entry1))
# True
print(is_a_match(query, entry2))
# True
print(is_a_match({'action': 'decline'}, entry2))
# 'action' does not match
# False