两个列表对应元素相同的索引列表
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]
我想比较两个不同的列表和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]