请原谅我,如果这个问题看似微不足道,但我在for循环中有一个字符串数组已被排序。我想删除数组中的一些重复项。我是Python的新手,所以我不知道是否有一个库可以让我删除数组中的重复项。这是我正在做的删除重复项目:
for i in teams:
if teams[i+1] is teams[i]:
teams.remove(teams[i])
现在if语句在C ++,C#和Java中运行得很好但是由于某种原因它返回错误“无法连接'str'和'int'对象”。
答案 0 :(得分:5)
i
是来自teams
的项。这不是一个索引。 (提示:调试此类问题时,请在循环中粘贴print(i)
以确保它符合您的想法。)
现在即使考虑到这一点,并重写代码以通过enumerate()
或range()
使用真实索引,您仍可能会遇到一些麻烦,因为您要从列表中删除项目而你正在迭代它。这将导致您跳过其中的一些,因为for
在内部使用索引并且每次循环时都添加1。因此,删除当前项目会将下一个更高的项目移动到其位置,然后索引将递增,并且 之后的下一个项目将被考虑。
问题最直接的解决方案是创建一个仅包含您要保留的元素的新列表:
newteams = []
for team in teams:
if not (newteams and newteams[-1] == team):
newteams.append(team)
基本上,只有当1)newteams
为空或2)newteams
的最后一项与当前团队不匹配时,才会向newteams
添加新项目。结果:任何长度的重复运行都减少为单个项目。如果需要修改列表teams
,请在之后使用切片分配:
teams[:] = newteams
另一种方法是使用set
来跟踪我们已经看过的项目。 (我们使用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转换为套装和退货的解决方案更简单。
答案 1 :(得分:2)
如果您只想删除列表中的重复字符串,可以使用set。将列表转换为集合,将其转换回列表然后排序:
teams = ['big','small','big','foo','bar','bar','foo']
teams = sorted(list(set(teams)))
In [12]: teams
Out[12]: ['bar', 'big', 'foo', 'small']
set
不允许重复,它会处理为您删除它们。此外,您现在正在排除重复项之后而不是之前的重复项,这应该更有效。
答案 2 :(得分:1)
groupby是一个方便的解决方案
from itertools import groupby
newteams = [k for k,g in groupby(teams)]
答案 3 :(得分:0)
这是你可能想要的。
for i in range(len(teams)):
if teams[i+1] == teams[i]:
teams.remove(teams[i])
您不应该使用teams[i+1] is teams[i]
,因为is
会比较被比较的2个对象的身份。必须仅通过==
来比较平等。
此外,您必须执行teams.remove(teams[i])
而不是del teams[i]
,因为您在了解索引的同时重复索引。
i in items
会为您提供项目中的元素。不是指数。
>>>teams = ['team1', 'team2', 'team3']
>>>for team in teams:
... print team
team1
team2
team3
虽然
>>>teams = ['team1', 'team2', 'team3']
>>>for i in range(3):
... print teams[i]
team1
team2
team3
您还可以使用内置enumerate
功能
teams = ['team1', 'team2', 'team3']
for index, team in enumerate(teams):
print index, "-->", team
以上输出
0 --> team1
1 --> team2
2 --> team3