2014-07-24 58 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]