查找两个数组列表之间所有不同交集和差异的 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]]
有什么建议吗?提前致谢!
没有必要分开参数,结果将与合并 x
和 y
相同。所以你有一组集合并尝试找到单独的部分。要找到它们,您可以遍历所有元素并记住在哪些集合中遇到了该值。然后,如果 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())
这是对我的
下一个例子的预期结果
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]]
有什么建议吗?提前致谢!
没有必要分开参数,结果将与合并 x
和 y
相同。所以你有一组集合并尝试找到单独的部分。要找到它们,您可以遍历所有元素并记住在哪些集合中遇到了该值。然后,如果 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())