两个列表对应元素相同的索引列表

List of index where corresponding elements of two lists are same

我想比较两个不同的列表和return相似的索引。

例如,如果我有两个列表,例如:

grades = ['A', 'B', 'A', 'E', 'D']
scored = ['A', 'B', 'F', 'F', 'D']

我的预期输出是:

 [0, 1, 4] #The  indexes of similar strings in both lists

然而这是我现在得到的结果:

[0, 1, 2, 4] #Problem: The 2nd index being counted again

我尝试过使用两种方法进行编码。

第一种方法:

def markGrades(grades, scored):
    indices = [i for i, item in enumerate(grades) if item in scored]
    return indices

第二种方法:

def markGrades(grades, scored):
    indices = []
    for i, item in enumerate(grades):
         if i in scored and i not in indices:
         indices.append(i)
    return indices

第二种方法 return 正确的字符串但不是索引。

您可以在 列表理解 中使用 enumerate along with zip 来实现此目的:

>>> grades = ['A', 'B', 'A', 'E', 'D']
>>> scored = ['A', 'B', 'F', 'F', 'D']

>>> [i for i, (g, s) in enumerate(zip(grades, scored)) if g==s]
[0, 1, 4]

您的代码存在问题,您没有比较同一索引处的元素。相反,通过使用 in,您正在检查一个列表的元素是否存在于另一个列表中。

因为 'A' grades 的索引 2 出现在 scored 列表中。您在结果列表中获得索引 2

你的逻辑失败了,因为它不检查元素是否在同一位置,只是 grades 元素出现在 某处 in scored.如果只是简单的检查对应的元素,就可以这么简单

使用第二种方法:

for i, item in enumerate(grades):
    if item == scored[i]:
        indices.append(i)

Anonymous 给出的解决方案是我要添加的解决问题的“Pythonic”方法。

您可以使用 zip

成对访问两个列表(以避免在另一个数组中的任何位置找到匹配项的过度概括)
grades = ['A', 'B', 'A', 'E', 'D']
scored = ['A', 'B', 'F', 'F', 'D']

matches = []
for ix, (gr, sc) in enumerate(zip(grades,scored)):
    if gr == sc:
        matches.append(ix)

或更紧凑的列表理解,如果这适合您的目的

matches = [ix for ix, (gr, sc) in enumerate(zip(grades,scored)) if gr == sc]