i
是来自的项目teams
。它不是一个索引。(提示:在调试此类问题时,print(i)
在循环中插入 a 以确保它是您认为的那样。)
现在,即使考虑到这一点,并通过enumerate()
or重写代码以使用真正的索引range()
,您仍然可能会遇到一些麻烦,因为您在迭代列表时会从列表中删除项目。这将导致您跳过其中的一些,因为for
在内部使用索引并在每次循环中添加 1。因此,删除当前项目会将下一个更高的项目移到它的位置,然后索引增加,然后考虑下一个。
该问题最直接的解决方案是创建一个仅包含您要保留的元素的新列表:
newteams = []
for team in teams:
if not (newteams and newteams[-1] == team):
newteams.append(team)
基本上,这newteams
只会在 1)newteams
为空或 2) 的最后一项newteams
与当前团队不匹配的情况下添加一个新项目。结果:任何长度的重复运行都减少为单个项目。如果这需要修改列表teams
,然后使用切片分配:
teams[:] = newteams
另一种方法是使用 aset
来跟踪我们已经看到的项目。(我们使用 a 是set
因为它可以快速检查其中是否有东西。)然后我们可以简单地省略我们已经在列表中的任何位置看到的项目——使用前面的方法,列表需要为此进行排序即将发生。
seen = set()
newteams = []
for team in teams:
if team not in seen:
newteams.append(team)
else:
seen.add(team)
稍微滥用一下 Python,可以将其浓缩为以下内容(尽管您可能不应该这样做,尤其是作为该语言的新手):
seen = set()
teams[:] = (seen.add(team) or team for team in teams if team not in seen)
当然,如果您不关心顺序(或愿意在之后对列表进行排序)@RMcG 转换为集合并返回的解决方案甚至更简单。