2014-07-24 80 views
1

前面列表中刪除元素假設我們有一個列表[Y, X, 4, Y, 3, X, 2, X]由一些特定元素

我希望能夠刪除被立即通過X之前的所有元素,並刪除X的自己。所以結果應該看起來像[Y, Y, 3]。這樣做的pythonic方式是什麼?

我想出了類似下面的東西,但我覺得它非常笨重,不乾淨。有沒有更好的方法來做到這一點?

list = [Y, X, 4, Y, 3, X, 2, X] 
is_preceded = False 
result = [] 
for i in list: 
    if i == 'X': 
     is_preceded = True 
    elif is_preceded == True: 
     is_preceded = False 
    else: 
     result.append(i) 

回答

4

使用ziplist comprehension

>>> lst = ['Y', 'X', 4, 'Y', 3, 'X', 2, 'X'] 
>>> [a for a, b in zip(lst, [''] + lst) if b != 'X' and a != 'X'] 
['Y', 'Y', 3] 

# a: current item 
# b: previous item 

BTW,不要使用list作爲變量NAEM。它影響內建類型/功能list


如果使用Python 2.x,zip將返回一個新列表。如果你不想使用itertools.izip

除此之外,如果您不想創建臨時列表([''] + lst),則可以使用itertools.chain([''], lst)

+0

尼斯,拉鍊想法是超級聰明!此外,謝謝你們不要使用「list」作爲變量名稱。 – CowZow

1

我會建議使用列表中理解向後處理列表,這樣

l = ['Y', 'X', 4, 'Y', 3, 'X', 2, 'X'] 
rs = [l[i] for i in range(len(l) - 1, 0, -1) if l[i - 1] != 'X' and l[i] != 'X'] 

if l[0] != 'X': 
    rs.append(l[0]) 

print rs[::-1] 
# ['Y', 'Y', 3]