合并二维数组的有效方法

时间:2020-03-12 14:05:50

标签: python algorithm

我想合并两个包含相同编号的列表。
每个列表包含唯一的编号,并且永远不会与另一个列表的一行以上匹配。
(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}]

1 个答案:

答案 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}]