【问题标题】:remove duplicate value based on comparison in multiple dictionary list python基于多个字典列表python中的比较删除重复值
【发布时间】:2022-01-07 16:15:53
【问题描述】:

我有 2 个大词典列表。这些是示例:

a= [{'name':'A','color':'1'},
   {'name':'B','color':'2'},
   {'name':'C','color':'3'},
  ]

b=[{'name':'A','color':'2'},
   {'name':'x','color':'4'},
   {'name':'x', 'color': '8'},
  {'name':'p','color':'5'},
  ]

我会根据另一个字典中的 "Name" 过滤掉 B 列表,并保留 Name 字段中的唯一性

我试过了:

[i for i in a for i in (filter(lambda x: x['name'] == i['name'],b))]

结果:

[{'name': 'A', 'color': '2'}]

这个结果与我的预期相反,它保留了 2 个列表中的相似名称..

我的期望:

  [
  {'name':'x','color':'8'},
  {'name':'p','color':'5'},
  ]

我需要 b 列表中不包含在 a.. 中的所有结果,还需要从 b 列表中删除唯一的..('name' : 'x' 只出现一次)

【问题讨论】:

  • 你为什么期待{'name':'x','color':'8'}而不是{'name':'x','color':'4'}
  • @SembeiNorimaki 因为它是 x 中的最后一个元素。所以{'name':'x','color':'4'} 将被{'name':'x','color':'8'} 覆盖

标签: python json python-3.x


【解决方案1】:

您可以创建一个临时字典,该字典以 b 中的“名称”值为键。这只会保留每个名称的最后一个字典。临时字典创建过程可能会跳过在a 中找到的名称。要获得最终过滤字典列表,请将临时字典的值转换为列表。

aNames   = {ad['name'] for ad in a}
distinct = {bd['name']:bd for bd in b if bd['name'] not in aNames}
newb     = list(distinct.values())

print(newb)
[{'name': 'x', 'color': '8'}, {'name': 'p', 'color': '5'}]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多