【问题标题】:Column intersection multiple python lists列交叉多个python列表
【发布时间】:2014-03-17 02:24:12
【问题描述】:

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

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

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

【问题讨论】:

  • 你究竟是如何得到这个结果的?您是说要查找有数字x 的情况,以便每个列表包含(x, y) 形式的元组?
  • 是的。就像,每个子列表都包含 (x, y) 形式的元组,所以我需要找到(假设)x 相同的所有元组。

标签: python numpy


【解决方案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)]

【讨论】:

    【解决方案2】:

    好的..我想出了一些东西..它是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 2021-08-01
      • 2020-04-18
      相关资源
      最近更新 更多