用于循环比较的Python

时间:2013-11-03 02:24:24

标签: python arrays

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

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

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

4 个答案:

答案 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