0

如果这个问题看起来微不足道,请原谅我,但我在 for 循环中有一个字符串数组,这些字符串已经过排序。数组中有一些我想删除的重复项。我对 Python 还很陌生,所以我不知道是否有一个库可以让我删除数组中的重复项。这是我为删除重复项所做的工作:

for i in teams:
        if teams[i+1] is teams[i]:
                teams.remove(teams[i])

现在,其中的 if 语句在 C++、C# 和 Java 中可以正常工作,但由于某种原因,它返回错误“无法连接 'str' 和 'int' 对象”。

4

4 回答 4

5

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 转换为集合并返回的解决方案甚至更简单。

于 2013-11-03T02:25:59.217 回答
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不允许重复,它会为您处理删除它们。此外,您现在正在删除重复项之后而不是之前进行排序,这应该更有效。

于 2013-11-03T03:02:23.590 回答
1

groupby 是一个方便的解决方案

from itertools import groupby
newteams = [k for k,g in groupby(teams)]
于 2013-11-03T03:00:43.657 回答
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
于 2013-11-03T02:28:00.520 回答