【问题标题】:Looping list of dictionaries and compare any matched values in other list [duplicate]循环字典列表并比较其他列表中的任何匹配值[重复]
【发布时间】:2021-02-02 13:24:28
【问题描述】:

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

【问题讨论】:

  • 你能添加预期的输出吗
  • 添加了预期输出
  • 'pmdruleid': 112 是从哪里来的?它不在两个字典中......
  • 编辑了问题。请检查
  • 我不确定预期的输出变量如何被称为t,但matching_active_client_rule_items=... 在所有迭代中都会覆盖该变量,因此它将仅包含rulenames 的最后一项的匹配项

标签: python list-comprehension


【解决方案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, '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']]

【讨论】:

    【解决方案2】:

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

    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']]
    

    【讨论】:

      【解决方案3】:

      似乎问题是列表每次都会刷新,所以我将其更改如下:

      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)
      
      

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

      【讨论】:

      • 你是对的,我编辑了它。
      【解决方案4】:

      尝试以下方法:

      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 中的字典,因此省略!

      【讨论】:

        猜你喜欢
        • 2021-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-20
        • 2023-01-07
        • 1970-01-01
        • 2020-05-30
        相关资源
        最近更新 更多