我有两个列表,其中包含列表元素,例如:
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]
的混合。但是,子列表结构始终相同(在两个列表中)。
如何获得两个列表中相同的列表元素的交集?
答案 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))]
这使用min
和max
,并为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中找到常见的哈希值。
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'}]}
str
也适用于简单的情况。您可以根据所需的数据集和效率做出选择。