假设您有一个列表列表如下:
A = [
[(1, 9), (2, 10), (3, 11), (4, 12), (5, 13), (6, 14), (7, 15), (8, 16)],
[(1, 19), (2, 110), (13, 1), (41, 112), (51, 131), (16, 141), (17, 15), (18, 16)],
[(1, 299), (2, 1310), (13, 111), (41, 112), (51, 131), (16, 141), (17, 15), (18, 16)]
]
我正在寻找的是在列表中现有元组的一列上找到交集的最快方法。例如,如果我需要找到x0上的列交集,其中每个子列表包含(x0,x1),那么输出应为:
out = [(1,9), (1,19), (2, 10), (2, 110), (1, 299), (2, 1310)]
基本上是一组具有第一列值相似的所有元素。
我用来找到一个匹配整个元组的普通交集的方法基本上是(它给出了所有子列表的完整匹配):
out = set.intersection(*map(set, A))
任何帮助都会很棒。感谢。
答案 0 :(得分:1)
三个步骤:
1)列出 x0 元素的集合。
2)找到这些步骤的交集。
3)最后,列出所有(x0,x1)对,其中 x0 位于重叠集合中。
以下是:
>>> first_elems = [{x0 for x0, x1 in sublist} for sublist in A]
>>> overlaps = set.intersection(*first_elems)
>>> [(x0, x1) for sublist in A for x0, x1 in sublist if x0 in overlaps]
[(1, 9), (2, 10), (1, 19), (2, 110), (1, 299), (2, 1310)]
答案 1 :(得分:0)
out = []
for aa in A:
out.append([b for b in aa if b[0] in set.intersection(*map(set, [r[:, 0] for r in numpy.array(A)]))])
out = [[(1, 9), (2, 10)], [(1, 19), (2, 110)], [(1, 299), (2, 1310)]]
out = [u for v in out for u in v]
现在,我应该比较这个和@Raymond的答案的速度。 :-)非常感谢。