从List中删除特定元组

时间:2013-10-06 08:56:46

标签: python list tuples

我有一个清单

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

答案 0 :(得分:4)

我使用list comprehension

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。

P.S。此功能不会更改原始列表,而是创建新列表。如果您的原始列表很大,我可能会像generator expression这样使用:

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

答案 1 :(得分:1)

这与你的方法不同,但应该有效

a = filter(lambda x: x[0] != 1, a)

答案 2 :(得分:1)

您可以像这样使用list comprehension来过滤掉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]

这里我们使用切片赋值,它通过使用列表推导中的项目替换原始列表的开头到结尾的每个项目([:])。如果你刚刚使用了正常的赋值,你只需更改名称original指向的内容,而不是实际修改列表本身。

答案 3 :(得分:0)

如果您处理大量数据,可以使用generator表达式执行此操作:

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)]