如何在包含相同元素的另一个列表中找到一个列表元素的索引?

3

我正在尝试用Python编写一个简单的任务(作为更大项目的一部分):

我有两个列表,第一个是排序过的,比如说 A = [1, 2, 3, 4, 5, 6],第二个是未排序的,比如说 B = [3, 4, 1, 6, 2, 5]。我想要做到的是,在列表 B 中找到每个排序好的列表 A 元素的索引值。例如,当我搜索元素 A[5] = 6 时,我希望得到索引值 i = 3 的结果。我已经按照下面的简单方式实现了它:

for i in range(6):
    for j in range(6):
        if A[i] == B[j]:
            index = j

我希望想出一种方法,将这两个嵌套的for循环缩减为只有一个循环。
4个回答

2
如果您知道B中的所有值都是唯一的,一种方法是创建一个将B中的值映射到它们的索引的字典。
b_dict = {}
for i, b in enumerate(B):
    b_dict[b] = i

然后,循环遍历 A 并从 b_dict 中获取所有的值。
a_indices = [b_dict[a] for a in A]

有了您的列表,我们得到了:

A: [1, 2, 3, 4, 5, 6]
B: [3, 4, 1, 6, 2, 5]
a_indices: [2, 4, 0, 1, 5, 3]

相比其他解决方案的O(n²)时间复杂度,这个解决方案的时间复杂度为O(n),因此在处理大型列表时速度更快。


1
最简单的解决方案是,

A = [1, 2, 3, 4, 5, 6]
B = [3, 4, 1, 6, 2, 5]
x= [B.index(i) for i in A]

#To store the result in a dictionary to map value and corresponding index.
a=dict(zip(A,x))

0
您可以使用 list.index() 方法在列表中查找特定元素的索引:
indices = {}
for elem in A:
    indices[elem] = B.index(elem)
# {1: 2, 2: 4, 3: 0, 4: 1, 5: 5, 6: 3}

这仍然是O(n^2),不是吗? - Pranav Hosangadi
它仍然是O(n^2),是的,但只使用一个for循环。至少在外部是这样。 - Green Cloak Guy

0

试试这个:

for x in A:
  index = B.index(x)

这里的 index 是每次迭代中的索引变量。

要保存到字典中:

indices = {}
for x in A:
  indices[x] = B.index(x)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接