从列表中删除元素之前的元素

时间:2014-07-24 16:02:49

标签: python list

假设我们有一个列表[Y, X, 4, Y, 3, X, 2, X]

我希望能够删除紧接在X之前的所有元素,并且还可以删除X' s。所以结果应该看起来像[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)

2 个答案:

答案 0 :(得分: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

顺便说一句,不要将list用作变量naem。它影响内置类型/功能list


如果您使用Python 2.x,zip将返回一个新列表。如果您不想使用itertools.izip

除此之外,如果您不想创建临时列表([''] + lst),则可以使用itertools.chain([''], lst)

答案 1 :(得分: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]