如何解决循环字典列表并比较其他列表中的任何匹配值
我有一个字典列表,我正在尝试循环并需要检查 'pmdruleid'
中的 rulenames
是否与 'pmdruleid'
中的任何 activeclientrulelist
匹配。我正在使用以下代码并且每次都收到 None
。下面的代码在循环中检查相应的索引值,而不是检查列表中的任何匹配值:
activeclientrulelist = [{'pmdruleid': 112,'createdby': 'Ad hoc Script - PHARMMD\\Jake.Woods','updatedby': None,'transferstatuscode': 1},{'pmdruleid': 10160,{'pmdruleid': 10016,{'pmdruleid':111,{'pmdruleid': 111,{'pmdruleid': 10020,'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112,'transferstatuscode': 1}]
if len(activeclientrulelist) > 0:
for rule in rulenames:
matching_active_client_rule_items = [y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']
预期输出
[{'pmdruleid': 112,'transferstatuscode': 1}]
解决方法
如果你想找到两个字典列表之间的交集,你可以这样做:
res = [x for x in activeclientrulelist if x in rulenames]
而 res
将是:
[{'pmdruleid': 112,'createdby': 'Ad hoc Script - PHARMMD\\Jake.Woods','updatedby': None,'transferstatuscode': 1},{'pmdruleid': 10160,'transferstatuscode': 1}]
如果您只想考虑您可以执行的 pmdruleid
键,则无需在列表理解之外循环 rulenames
,否则您会覆盖结果:
[x for x in activeclientrulelist for y in rulenames if x['pmdruleid'] == y['pmdruleid']]
,
问题似乎是每次都刷新列表,所以我将其更改如下:
matching_active_client_rule_items=[]
if len(activeclientrulelist) > 0:
for rule in rulenames:
matching_active_client_rule_items.extend( [y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']])
print(matching_active_client_rule_items)
我在上面定义了一个空列表,并通过正确的项目扩展了列表。
,您当前的代码有几个问题:
- 在第
]
行的末尾缺少一个matching_active_client_rule_items = [y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']
。 - 使用此行:
matching_active_client_rule_items = [y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']
,您将覆盖列表对象,其中仅包含rulenames
中最后一项的输出。
您需要创建一个列表并对其进行扩展以修复代码:
matching_active_client_rule_items = []
if len(activeclientrulelist) > 0:
for rule in rulenames:
matching_active_client_rule_items.extend([y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']])
虽然这有效,但您应该使用如下列表理解方法来获取两个列表的交集:
matching_active_client_rule_items = [x for x in activeclientrulelist for y in rulenames if x['pmdruleid'] == y['pmdruleid']]
,
尝试以下操作:
activeclientrulelist = [{'pmdruleid': 112,{'pmdruleid': 10016,{'pmdruleid':111,{'pmdruleid': 111,{'pmdruleid': 10020,'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112,{'pmdruleid': 101,'transferstatuscode': 1}]
result = [check for check in rulenames for rule in activeclientrulelist if rule['pmdruleid']==check['pmdruleid']]
print(result)
在这种情况下,rulenames
: 'pmdruleid': 101
不属于 activeclientrulelist
中的字典,因此省略!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。