列交叉多个python列表

时间:2014-03-17 02:24:13

标签: python numpy

假设您有一个列表列表如下:

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))

任何帮助都会很棒。感谢。

2 个答案:

答案 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的答案的速度。 :-)非常感谢。