返回
如何在 Python 中查找两个嵌套列表的交集?
python
2024-03-05 14:38:49
寻找嵌套列表的交集
问题
在 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]]
解决方案步骤
为了解决这个问题,我们可以使用分步过程:
- 展平列表: 使用
itertools.chain.from_iterable()
函数将嵌套列表展平为单个列表。 - 转换为集合: 使用
set()
函数将展平后的列表转换为集合,以消除重复项。 - 使用交集运算: 使用
&
运算符查找两个集合的交集。 - 重新格式化为嵌套列表: 使用嵌套列表推导式将交集重新格式化为嵌套列表。
代码实现
以下代码片段演示了上述步骤的实现:
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. 这种方法有什么限制?
该方法适用于元素可以转换为集合的嵌套列表。如果元素是复杂对象,则需要自定义比较函数或使用其他数据结构,如字典。