用于循环比较的Python

Gen*_*idd 0 python arrays

请原谅我,如果这个问题看似微不足道,但我在for循环中有一个字符串数组已被排序.我想删除数组中的一些重复项.我是Python的新手,所以我不知道是否有一个库可以让我删除数组中的重复项.这是我正在做的删除重复项目:

for i in teams:
        if teams[i+1] is teams[i]:
                teams.remove(teams[i])
Run Code Online (Sandbox Code Playgroud)

现在if语句在C++,C#和Java中运行得很好但是由于某种原因它返回错误"无法连接'str'和'int'对象".

kin*_*all 5

i是来自的项目teams.这不是一个索引.(提示:在调试此类问题时,请print(i)在循环内部进行操作以确保它符合您的想法.)

现在,即使考虑到这一点,并重写您的代码以通过enumerate()或使用真实索引range(),您可能仍然有一些麻烦,因为您在迭代它从列表中删除项目.这将导致您跳过其中的一些,因为for在内部使用索引并且每次通过循环将其添加1.因此,删除当前项移动下一个较高的项目到原来的位置,那么增加索引和后下一个现在被认为是.

解决问题的最直接的解决方案是创建一个仅包含要保留的元素的新列表:

newteams = []
for team in teams:
    if not (newteams and newteams[-1] == team):
        newteams.append(team)
Run Code Online (Sandbox Code Playgroud)

基本上,newteams只有当1)newteams为空或2)最后一项newteams与当前团队不匹配时,才会添加新项目.结果:任何长度的重复运行都减少为单个项目.如果这需要teams在适当的位置修改列表,那么之后使用切片分配:

teams[:] = newteams
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用a set来跟踪我们已经看过的项目.(我们使用a,set因为它可以快速查看是否有内容.)然后我们可以简单地省略我们已经在列表中的任何位置看到过的项目- 使用之前的方法,列表需要对其进行排序即将发生.

seen = set()
newteams = []
for team in teams:
    if team not in seen:
        newteams.append(team)
    else:
        seen.add(team)
Run Code Online (Sandbox Code Playgroud)

稍微滥用Python,可以将其浓缩为以下内容(尽管您可能不应该,尤其是作为该语言的新手):

seen = set()
teams[:] = (seen.add(team) or team for team in teams if team not in seen)
Run Code Online (Sandbox Code Playgroud)

当然,如果您不关心订单(或者愿意随后对列表进行排序)@ RMcG的转换为套装和返回的解决方案甚至更简单.