2013-10-06 112 views
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) 

我认为所有的出现次数应该是removed.However当我说

Print a 

我得到[(1,4),(2,6),(3,6),(1,6)]不是所有的元组都被删除了。我该怎么做。?? 感谢

回答

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

对于我来说,更Python比内置filter功能。

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

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

这一个更好的解决方案 – doniyor

1

这是不一样的方法,因为你的,但应该工作

a = filter(lambda x: x[0] != 1, a) 
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指向的名称,而不实际修改列表本身。

+0

但我想想,他想从列表中删除。你的代码是否从列表中删除它们? – doniyor

+0

如果实际需要修改原始列表,则始终可以指定回原始(99%的时间不会)。 'original [:] = new'。我编辑了一些格式并添加了解释。 –

+0

而downvoting的原因是? – thefourtheye

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