我想合并两个包含相同编号的列表。
每个列表包含唯一的编号,并且永远不会与另一个列表的一行以上匹配。
(listA的[2, 1, 3, 4, 5]
只匹配listB的单行[1, 4, 3, 10]
)
我在下面用Python编写了代码。 有没有更有效的方法来合并两个列表? 尽管示例代码的列表长度只有3个,但我希望列表的长度更像1k,所以我想找到一种更有效的方法。
listA = [
[2, 1, 3, 4, 5],
[50, 56, 60, 51],
[101, 112, 115, 110],
]
listB = [
[50, 63, 70],
[1, 4, 3, 10],
[120, 112, 116, 113],
]
mapA = {}
for idx, list_a in enumerate(listA):
for item in list_a:
mapA[item] = idx
result = []
for list_b in listB:
for item in list_b:
if item in mapA:
idx_of_listA = mapA[item]
nums = set(listA[idx_of_listA] + list_b)
result.append(nums)
break
print(result)
# [{70, 50, 51, 56, 60, 63}, {1, 2, 3, 4, 5, 10}, {101, 110, 112, 113, 115, 116, 120}]
答案 0 :(得分:2)
这看起来像一个connected components
的问题,您可以使用networkX
来找到它们(只是改编了我的回答):
import networkx as nx
G=nx.Graph()
for l in [listA, listB]:
for sl in l:
nx.add_path(G, sl)
list(nx.connected_components(G))
[{1, 2, 3, 4, 5, 10},
{50, 51, 56, 60, 63, 70},
{101, 110, 112, 113, 115, 116, 120}]