我希望获得2个嵌套列表的并集以及常用值的索引。
我有两个列表,例如A = [[1,2,3],[4,5,6],[7,8,9]]
和B = [[1,2,3,4],[3,3,5,7]]
,但每个列表的长度大约是100 000.到A属于一个带有len(A)
的索引向量:I = [2,3,4]
我想要的是找到B中的所有子列表,其中前3个元素等于A中的子列表。在此示例中,我希望返回B[0]
([1,2,3,4]
),因为它的前三个元素等于A[0]
。此外,我还希望在此示例中将索引设置为A[0]
,即I[0]
。
我尝试了不同的东西,但到目前为止没有任何工作:(
首先我尝试了这个:
Common = []
for i in range(len(B)):
if B[i][:3] in A:
id = [I[x] for x,y in enumerate(A) if y == B[i][:3]][0]
ctdCommon.append([int(id)] + B[i])
但这需要很长时间,或者永远不会结束
然后我将A
和B
转换成集并从两者中取出了联合,这非常快,但后来我不知道如何获得相应的索引
有没有人有想法?
答案 0 :(得分:1)
创建辅助字典(work is O(len(A)
) - 假设A中子列表的前三项唯一标识它(否则你需要列表的字典):
aud = dict((tuple(a[:3]), i) for i, a in enumerate(A))
使用所述dict在B上循环一次(work is O(len(B))
)以获得B子列表和A索引:
result = [(b, aud[tuple(b[:3])]) for b in B if tuple(b[:3]) in aud]