循环字典列表并比较其他列表中的任何匹配值

问题描述

我有一个字典列表,我正在尝试循环并需要检查 '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)

我在上面定义了一个空列表,并通过正确的项目扩展了列表。

,

您当前的代码有几个问题:

  1. 在第 ] 行的末尾缺少一个 matching_active_client_rule_items = [y for y in activeclientrulelist if y['pmdruleid'] == rule['pmdruleid']
  2. 使用此行: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 中的字典,因此省略!

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...