numpy 在2D python列表中查找元素索引的最快方法

mwg9r5ms  于 2023-03-30  发布在  Python
关注(0)|答案(3)|浏览(151)

我在2D列表中搜索元素索引的有效实现方面遇到了问题。例如,有两个列表(其中list2具有来自list1的置换元素):

list1 = [[0,1],[2,3],[4,5],[6,7,8],[9,10,11],[12,13,14]]

list2 = [[8,2],[1,9],[6,4],[13,5,0],[14,7,10],[12,11,3]]

最后,我想得到list3,它的大小和形状与前面提到的两个列表相同。我需要list3看起来像这样,在这个例子中:

list3 = [[3,1],[0,5],[2,3],[2,4,0],[1,4,5],[5,3,4]]

所以第一个元素'3'是list2中sublist的索引,其中sublist是list1中的元素'0'。我希望这是清楚的。主要问题是基于list1中的元素在list2中的搜索。对于大小为100 000的更大列表,这真的很难。
我试过这段代码,它包含4个for循环和另一个基于np.argwhere的循环,但是numpy的实现更加耗时。

第一次实施

for index1, sublist1 in enumerate(list1):
    for i in range(len(sublist1)):

        for index2, sublist2 in enumerate(list2):
            for j in range(len(sublist2)):
                if sublist2[j] == sublist[1]:
                    list1[index1][i] = index1
                    list2[index2][j] = index2

第二次实施

for index1, sublist1 in enumerate(list1):
    for i in range(len(sublist1)):
        where = np.argwhere(list2 == sublist1[i])
        list1[index1][i] = where[0, 0]

我希望有另一种方法可以比这两种方法快得多,特别是对于较大的列表,即100 000。

wswtfjt7

wswtfjt71#

您可以从list2创建一个临时Map,然后使用它来创建输出:

list1 = [[0, 1], [2, 3], [4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14]]
list2 = [[8, 2], [1, 9], [6, 4], [13, 5, 0], [14, 7, 10], [12, 11, 3]]

m = {v: i for i, t in enumerate(list2) for v in t}
out = [[m[list1[i][j]] for j in range(len(t))] for i, t in enumerate(list2)]

print(out)

图纸:

[[3, 1], [0, 5], [2, 3], [2, 4, 0], [1, 4, 5], [5, 3, 4]]
3duebb1j

3duebb1j2#

list2中的子列表的索引使用Map字典,然后使用列表解析:

mapper = {x: i for i, l in enumerate(list2) for x in l}

list3 = [[mapper.get(x, -1) for x in l] for l in list1]
  • 注意。我将-1分配给可能丢失的值。此外,如果list2中有重复的值,将使用最后一个索引。*

输出:[[3, 1], [0, 5], [2, 3], [2, 4, 0], [1, 4, 5], [5, 3, 4]]

qyuhtwio

qyuhtwio3#

list2转换为dict,其中key是子列表中的每个元素,value是所述子列表的索引。如果有重复,您将需要额外的注意-现在还不清楚如何处理它们。然后迭代list1以创建预期的输出。

list1 = [[0,1],[2,3],[4,5],[6,7,8],[9,10,11],[12,13,14]]
list2 = [[8,2],[1,9],[6,4],[13,5,0],[14,7,10],[12,11,3]]

lookup_dict = {key:idx for idx, sublist in enumerate(list2) for key in sublist}
result = [[lookup_dict.get(key) for key in item] for item in list1]
print(result)

输出

[[3, 1], [0, 5], [2, 3], [2, 4, 0], [1, 4, 5], [5, 3, 4]]

相关问题