2013-10-06 147 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)]