首页 > 解决方案 > 如何使用 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]
]

标签: pythonpython-2.7

解决方案


也许有点矫枉过正,但尝试从多个方面查看问题总是有用的。如果我们将每个数字视为一个节点,将每个子列表视为一个边,那么问题就归结为寻找图的连通分量。

这可以很容易地用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]]

推荐阅读