查找两个数组列表之间所有不同交集和差异的 Pythonic 方法

Pythonic way to find all the different intersections and differences between two lists of arrays

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

下一个例子的预期结果

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

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

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

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