python - 如何使用 Python 在不同大小的列表列表中查找重复项并创建另一个包含分组元素的列表?
问题描述
我有一个类似下面的列表
[
[1, 2], [3], [4], [5, 6], [7], [8], [9], [10], [11, 14], [12, 13],
[15], [16], [17], [18], [19], [20], [21, 61], [22], [23], [24], [25],
[26, 45], [27], [28], [29], [30], [31], [32], [33], [34], [35, 36],
[37], [38], [39], [40, 41], [42, 48], [43], [44], [46], [47], [49],
[50], [51], [52], [53], [54, 62], [55, 56], [57], [58, 59], [60, 61],
[63, 62], [64], [65], [66, 67], [68], [69]
]
正如我们所见,62 存在于 [54, 62] 和 [63, 62] 中。
我想创建一个新的子列表,将 [54, 62] 和 [63, 62] 分组为 [54,62,63]。
这样我的新列表如下:
[
[1, 2], [3], [4], [5, 6], [7], [8], [9], [10], [11, 14], [12, 13],
[15], [16], [17], [18], [19], [20], [21, 61], [22], [23], [24], [25],
[26, 45], [27], [28], [29], [30], [31], [32], [33], [34], [35, 36],
[37], [38], [39], [40, 41], [42, 48], [43], [44], [46], [47], [49],
[50], [51], [52], [53], [54, 62, 63], [55, 56], [57], [58, 59],
[60, 61], [64], [65], [66, 67], [68], [69]
]
解决方案
也许有点矫枉过正,但尝试从多个方面查看问题总是有用的。如果我们将每个数字视为一个节点,将每个子列表视为一个边,那么问题就归结为寻找图的连通分量。
这可以很容易地用networkx
.
import networkx
from itertools import chain
lst = [
[1, 2], ..., [68], [69]
]
g = networkx.Graph()
g.add_nodes_from(chain.from_iterable(lst))
g.add_edges_from(i for i in lst if len(i) == 2)
result = [list(i) for i in networkx.connected_components(g)]
产量:
[[1, 2],
[3],
[4],
[5, 6],
[7], ...
[66, 67],
[68],
[69]]
推荐阅读
- python - 如何在 python 中将我的结果写入 .csv 文件的两行?
- r - Rstudio中的SIR模型闪亮
- angularjs - 将函数注入 angularjs 模块的最简单方法是什么?
- asp.net-core - .Net Core 项目引用 .Net Frameork 项目有问题吗?
- android - AndroidXMapFragment 从片段初始化时返回 null
- javascript - 为什么 load 没有加载我的 data.text 文件?
- angular - 具有角度和弹簧引导的路由权限的用户登录
- java - Java 奇怪的泛型行为
- python - 如何根据条件删除嵌套列表的元素?
- aem - 在 AEM 6.5 和 Java 11 上打开页面属性时在日志中使用 NPE 发出警告