0

我有一个清单

a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)]

如果我这么说:

for x in a:
    if x[0]==1:
        print x

我得到了预期的结果: (1,2) (1,4) (1,8) (1,10) (1,6)

但是我想删除格式(1,x)中所有元组的所有出现,所以

for x in a:
   if x[0]==1:
       a.remove(x)

我认为应该删除所有发生的事情。但是当我说

Print a

我得到 [(1,4),(2,6),(3,6),(1,6)]

并非所有元组都被删除。我该怎么做。??谢谢

4

4 回答 4

4

我会使用列表理解

def removeTuplesWithOne(lst):
    return [x for x in lst if x[0] != 1]

a = removeTuplesWithOne([(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)])

对我来说,它比内置filter函数更 Pythonic。

PS 此功能不会更改您的原始列表,它会创建新列表。如果您的原始列表很大,我可能会像这样使用生成器表达式

def removeTuplesWithOne(lst):
    return (x for x in lst if x[0] != 1)
于 2013-10-06T09:02:53.957 回答
1

这与您的方法不同,但应该可以

a = filter(lambda x: x[0] != 1, a)
于 2013-10-06T09:00:10.160 回答
1

您可以像这样使用列表理解来过滤掉1作为第一个元素的项目。

>>> original = [(1, 2), (1, 4), (2, 6), (1, 8), (3, 6), (1, 10), (1, 6)]
>>> [item for item in original if item[0] != 1]
[(2, 6), (3, 6)]

这会创建一个新列表,而不是修改现有列表。99% 的情况下,这会很好,但如果您需要修改原始列表,您可以通过分配回:

original[:] = [item for item in original if item[0] != 1]

在这里,我们使用切片分配,它通过将原始列表 (the [:]) 开头到结尾的每个项目替换为列表推导中的项目。如果您只是使用普通分配,您只需更改名称original指向的内容,而不是实际修改列表本身。

于 2013-10-06T09:02:20.920 回答
0

如果您要处理大量数据,则可以使用生成器表达式来完成:

a = [(1,2),(1,4),(2,6),(1,8),(3,6),(1,10),(1,6)]

# create a generator
a = ((x,y) for x, y in a if x == 1)

# simply convert it to a list if you need to...
>>> print list(a)
[(1, 2), (1, 4), (1, 8), (1, 10), (1, 6)]
于 2013-10-06T09:05:29.347 回答