我在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。
3条答案
按热度按时间wswtfjt71#
您可以从
list2
创建一个临时Map,然后使用它来创建输出:图纸:
3duebb1j2#
对
list2
中的子列表的索引使用Map字典,然后使用列表解析:-1
分配给可能丢失的值。此外,如果list2
中有重复的值,将使用最后一个索引。*输出:
[[3, 1], [0, 5], [2, 3], [2, 4, 0], [1, 4, 5], [5, 3, 4]]
qyuhtwio3#
将
list2
转换为dict,其中key是子列表中的每个元素,value是所述子列表的索引。如果有重复,您将需要额外的注意-现在还不清楚如何处理它们。然后迭代list1
以创建预期的输出。输出