返回

如何在 Python 中查找两个嵌套列表的交集?

python

寻找嵌套列表的交集

问题

在 Python 中,查找两个嵌套列表的交集可能会让人不知所措。虽然查找扁平列表的交集相对简单,但处理嵌套数据结构时,事情就会变得复杂。

例如,考虑以下嵌套列表:

c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

我们的目标是找到两个列表的交集,结果应如下所示:

c3 = [[13, 32], [7, 13, 28], [1, 6]]

解决方案步骤

为了解决这个问题,我们可以使用分步过程:

  1. 展平列表: 使用 itertools.chain.from_iterable() 函数将嵌套列表展平为单个列表。
  2. 转换为集合: 使用 set() 函数将展平后的列表转换为集合,以消除重复项。
  3. 使用交集运算: 使用 & 运算符查找两个集合的交集。
  4. 重新格式化为嵌套列表: 使用嵌套列表推导式将交集重新格式化为嵌套列表。

代码实现

以下代码片段演示了上述步骤的实现:

import itertools

c1 = [1, 6, 7, 10, 13, 28, 32, 41, 58, 63]
c2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]

flattened_c2 = list(itertools.chain.from_iterable(c2))
set_c1 = set(c1)
set_c2 = set(flattened_c2)

intersection = set_c1 & set_c2

c3 = [[item for item in sublist if item in intersection] for sublist in c2]

print(c3)

输出:

[[13, 32], [7, 13, 28], [1, 6]]

结论

通过遵循这些步骤,你可以轻松有效地查找两个嵌套列表的交集。这种方法简单明了,可以应用于各种嵌套数据结构。

常见问题解答

1. 我可以更改输出格式吗?

是的,你可以根据需要修改嵌套列表推导式来更改输出格式。

2. 如何处理重复项?

使用集合消除了重复项,因此输出列表不包含重复项。

3. 该方法是否适用于多维嵌套列表?

是的,该方法适用于任意维度的嵌套列表。

4. 是否有其他查找交集的方法?

可以使用 itertools.starmap() 函数或 Pandas 库来查找交集,但上述方法是简单而高效的。

5. 这种方法有什么限制?

该方法适用于元素可以转换为集合的嵌套列表。如果元素是复杂对象,则需要自定义比较函数或使用其他数据结构,如字典。