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

2024-04-25 08:55:23 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]。但是,子列表结构总是相同的(在两个列表中)。你知道吗

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


Tags: 字符串元素列表dataresult结构list2list1
2条回答

一个简单的解决方案,它将独立于数据的结构。 您可以为数据生成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也适用于简单的情况。您可以根据您的数据集和所需的效率进行选择。你知道吗

如果我的理解是正确的,您可以通过检查并选择最小列表中与较大列表中元素相等的元素的^{}来获得交集。你知道吗

理解一下,这看起来是这样的:

intersection_res = [l for l in min(list2, list1, key=len) if any(l == l2 for l2 in max(list1, list2, key=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)]

相关问题 更多 >

    热门问题