【问题标题】:Pythonic way to find all the different intersections and differences between two lists of arrays查找两个数组列表之间所有不同交集和差异的 Pythonic 方法
【发布时间】:2020-05-19 14:35:46
【问题描述】:

这是我的previous question 的概括。我需要找到两个不同数组列表之间的所有交叉点和差异。任何列表的数组内都没有交集,只有不同列表中的数组之间才有交集。

下一个示例的预期结果

x = [np.array([0, 6, 7, 10]), np.array([1, 2, 5, 9])]
y = [np.array([ 7, 10]), np.array([8]), np.array([0, 3, 4, 5])]

应该是

[[0], [6], [7, 10], [1, 2, 9], [5], [8], [3, 4]]

有什么建议吗?提前致谢!

【问题讨论】:

  • (0,6,7,10)和(7,10)之间的分解应该是什么?不应该是 (0,6) (7,10) 和 ( ) 吗?第三组应该是空的或什么都没有,因为 (7,10) 中没有不相交的部分。
  • 在 (0,6,7,10) 和 (7,10) 之间,函数应该返回 (0,6) 和 (7,10),但在这种特殊情况下, (0, 6 ) 被进一步分解为 (0) 和 (6),因为 (0, 3, 4, 5) 中存在 0,但那里不存在 6。
  • 我明白了。所以分解应该发生直到没有剩余的相交集?
  • 是的,就是这样。
  • 如果 u 和 v 中没有交集,但 u 中存在交集怎么办?像 u=[ (1,10),(2,10) ] 和 v=[(3,4),(5,6)]。来自 u 和 v 的任何一对数组之间没有任何交集。所以答案应该是 (1,10),(2,10)(3,4)(5,6) 吗?还是应该是(1),(10),(2),(3,4)(5,6)?

标签: python numpy set intersection difference


【解决方案1】:

没有必要分开参数,结果将与您联合xy相同。所以你有一组集合并尝试找到单独的部分。要找到它们,您可以遍历所有元素并记住在哪个集合中遇到了该值。然后,如果 2 个元素具有完全相同的集合集(假设它们在第二个和第四个集合中相遇),我们将这个元素作为联合群返回。

from collections import defaultdict


def pythonic(s):
    """
    >>> pythonic([[0, 6, 7, 10], [1, 2, 5, 9], [7, 10], [0, 3, 4, 5]])
    [[0], [6], [7, 10], [1, 2, 9], [5], [3, 4]]
    >>> pythonic([[7, 10], [8], [0, 3, 4, 5], [0, 6, 7, 10], [1, 2, 5, 9]])
    [[7, 10], [8], [0], [3, 4], [5], [6], [1, 2, 9]]
    >>> pythonic([[0, 1, 4, 5], [1, 2, 3, 4], [3, 4, 5, 6]])
    [[0], [1], [4], [5], [2], [3], [6]]
    """
    all_elements = defaultdict(list)
    for i, ss in enumerate(s):
        for elem in ss:
            all_elements[elem].append(i)
    reversed = defaultdict(list)
    for k, v in all_elements.items():
        reversed[frozenset(v)].append(k) # or tuple can be used but "frozenset" feels "safer"
    return list(reversed.values())

【讨论】:

  • 非常感谢!我测试了它,它似乎工作得很好。昨天我正在寻找一些与 defaultdict 类似的问题作为答案,我想我还有很多东西要学。很难表达我对您的帮助的感激之情。
猜你喜欢
  • 1970-01-01
  • 2013-02-08
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2014-01-16
  • 2021-03-18
相关资源
最近更新 更多