如何解决两个列表对应元素相同的索引列表
我想比较两个不同的列表并返回相似刺的索引。
例如,如果我有两个列表,例如:
grades = ['A','B','A','E','D']
scored = ['A','F','D']
我的预期输出是:
[0,1,4] #The indexes of similar strings in both lists
然而这是我目前得到的结果:
[0,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
第二种方法返回正确的字符串,但不返回索引。
解决方法
您可以在列表推导式中使用 enumerate
和 zip
来实现:
>>> grades = ['A','B','A','E','D']
>>> scored = ['A','F','D']
>>> [i for i,(g,s) in enumerate(zip(grades,scored)) if g==s]
[0,1,4]
您的代码的问题在于您没有比较同一索引处的元素。相反,通过使用 in
,您可以检查一个列表的元素是否存在于另一个列表中。
因为 'A'
的索引 2
处的 grades
存在于 scored
列表中。您将在结果列表中获得索引 2
。
您的逻辑失败了,因为它不检查元素是否在同一位置,而只是检查 grades
元素出现在 scored
中的某处。如果你只是简单地检查相应的元素,你就可以简单地做到这一点。
使用第二种方法:
for i,item in enumerate(grades):
if item == scored[i]:
indices.append(i)
Anonymous
给出的解决方案是我即将添加的解决问题的“Pythonic”方法。
您可以使用 zip
grades = ['A','D']
scored = ['A','D']
matches = []
for ix,(gr,sc) in enumerate(zip(grades,scored)):
if gr == sc:
matches.append(ix)
或者更紧凑的列表理解,如果这适合你的目的
matches = [ix for ix,scored)) if gr == sc]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。