dict过滤 python_python-以简单易读的方式过滤字典

理论

‘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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值