获取具有不同子列表数据类型的列表元素的交集

时间:2016-09-13 13:11:10

标签: python list python-3.x intersection python-3.5

我有两个列表,其中包含列表元素,例如:

list1 = [['placeholder1', {'data': 'data1'}], ['placeholder2', {'data': 'data2'}], ['placeholder2', {'data': 'data1'}]]
list2 = [['placeholder2', {'data': 'data2'}], ['placeholder3', {'data': 'data5'}]]

intersection_result = [['placeholder2', {'data': 'data2'}]]

子列表元素的结构只是一个例子。还可能发生所有子列表元素包含字符串['asdf', 'qwert']或字符串和数字['sdfs', 232]的混合。但是,子列表结构始终相同(在两个列表中)。

如何获得两个列表中相同的列表元素的交集?

2 个答案:

答案 0 :(得分:3)

如果我的理解是正确的,你可以通过检查并选择最小列表中等于较大列表中元素的any()来获得交集。

通过理解,这看起来像这样:

intersection_res = [l for l in min(list2, list1, key=len) if any(l == l2 for l2 in max(list1, list2, key=len))]

这使用minmax,并为len分配了一个密钥,以便始终从较小的列表中进行选择,并检查较大的列表。

这会产生:

print(intersection_res)
[['placeholder2', {'data': 'data2'}]]

如果您预先指定最小 - 最大列表,或者当您始终确定哪个列表大于另一个列表时,可以减少这种理解:

sm, la = list1, list2 if len(list1) < len(list2) else list2, list1
intersection_res = [l for l in sm if any(l == l2 for l2 in la)]

答案 1 :(得分:1)

一个简单的解决方案,独立于数据结构。 您可以为数据生成signature hashes(使用json或pformat),并在list1和list2中找到常见的哈希值。

演示http://ideone.com/5i9cs8

import json

list1 = [['placeholder1', {'data': 'data1'}], ['placeholder2', {'data': 'data2'}], ['placeholder2', {'data': 'data1'}]]
list2 = [['placeholder2', {'data': 'data2'}], ['placeholder3', {'data': 'data5'}]]
sig1 = { hash(json.dumps(x, sort_keys=True)):x for x in list1 }
sig2 = { hash(json.dumps(x, sort_keys=True)):x for x in list2 }
result = {x:sig1[x] for x in sig1 if x in sig2}
print(result)
#prints {-7754841686355067234: ['placeholder2', {'data': 'data2'}]}
  • 如果您的词典中包含不支持json序列化的数据,例如datetime,pformat运行良好,或者你可以使用cPickle,str也适用于简单的情况。您可以根据所需的数据集和效率做出选择。
相关问题