循环字典列表并比较其他列表中的任何匹配值
Looping list of dictionaries and compare any matched values in other list
我有一个字典列表,我正在尝试循环并需要检查 rulenames
中的 'pmdruleid'
是否与 activeclientrulelist
中的任何 'pmdruleid'
匹配。我正在使用下面的代码并且每次都得到 None
。下面的代码检查循环中相应的索引值,而不是检查列表中的任何匹配值:
activeclientrulelist = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10016, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid':111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10020, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, '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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
如果你想找到 2 个字典列表之间的交集,你可以这样做:
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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, '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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10016, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid':111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10020, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 101, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
result = [check for check in rulenames for rule in activeclientrulelist if rule['pmdruleid']==check['pmdruleid']]
print(result)
在这种情况下, rulenames
: 'pmdruleid': 101
不属于 activeclientrulelist
中的词典,因此省略!
我有一个字典列表,我正在尝试循环并需要检查 rulenames
中的 'pmdruleid'
是否与 activeclientrulelist
中的任何 'pmdruleid'
匹配。我正在使用下面的代码并且每次都得到 None
。下面的代码检查循环中相应的索引值,而不是检查列表中的任何匹配值:
activeclientrulelist = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10016, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid':111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10020, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, '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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
如果你想找到 2 个字典列表之间的交集,你可以这样做:
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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, '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, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10016, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid':111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 111, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10020, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
rulenames = [{'pmdruleid': 112, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 10160, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1},
{'pmdruleid': 101, 'createdby': 'Ad hoc Script - PHARMMD\Jake.Woods', 'updatedby': None, 'transferstatuscode': 1}]
result = [check for check in rulenames for rule in activeclientrulelist if rule['pmdruleid']==check['pmdruleid']]
print(result)
在这种情况下, rulenames
: 'pmdruleid': 101
不属于 activeclientrulelist
中的词典,因此省略!