【问题标题】:Intersection of two lists of dict - Python两个dict列表的交集 - Python
【发布时间】:2014-04-12 20:28:28
【问题描述】:

我有两个字典列表

listA = [{'id': 'abc', 'key1': '542696d8485b'}]
listB = [{'id': 'abc', 'key1': '542696d8485b'}, {'id': 'def', 'key1': '27348628grn'}]

我要提取listC = [{'id': 'abc', 'key1': '542696d8485b'}]

即我想根据“id”字段查找交集(基于任何一个字段,假设列表中的常见项目完全相同)。建议我一些有效的pythonic方式...

怎么样

listA_set = set(item['id'] for item in listA)
listB_set = set(item['id'] for item in listB)
listC_set = listA_set & listB_set
listC = {item:listA[item] for item in listC_set}

【问题讨论】:

  • 如果id相同但key1不同,key1的值应该是多少?
  • 我认为两个列表中提到的值完全相同,仍然更新了我的问题 - 我想现在更好。
  • @Nish 你认为使用集合比使用列表更好吗?
  • 有趣的是,这个有多个反对票,而stackoverflow.com/questions/33542997/… 有赞成票...

标签: python list dictionary list-comprehension


【解决方案1】:

为什么不使用列表推导:

listA = [{'id': 'abc', 'key1': '542696d8485b'}]
listB = [{'id': 'abc', 'key1': '542696d8485b'}, {'id': 'def', 'key1': '27348628grn'}]

print [i for i in listA for j in listB if i['id']==j['id']]

【讨论】:

    【解决方案2】:

    你可以只使用一个简单的过滤

    b_ids = set(d["id"] for d in listB)
    result = [d for d in listA if d["id"] in b_ids]
    

    假设您希望在 listB 中存在具有相同 "id" 值的可能不同的字典时保留字典而不是 listA

    【讨论】:

    • 我的方法怎么样? - 见编辑的问题。您正在遍历完整的 listB id。
    • @Nish:我已经从listB 中的 id 构建了一个集合,因此列表理解中使用的in 是 O(1)。这两个列表中的每一个都只完整迭代一次,唯一不需要的情况是其中一个列表为空。您的示例还在两个完整列表上进行迭代(在构建集合时),然后在交集上进行另一次迭代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多