从列表中删除某些特定元素之前的元素

时间:2018-01-20 09:59:19

标签: python list

我们说我有一个列表:

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']

在这里,我想删除'no' 之前的每个'yes'。所以我的结果列表应该是

['no', 'no', 'yes', 'yes', 'no']

我发现为了从列表中删除元素值,我们可以使用list.remove(..)作为:

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
a.remove('no')
print a

但是它给我的结果只删除了第一次出现的'no'

['no', 'no', 'yes', 'no', 'yes', 'no']

如何通过删除列表中所有'no'之前出现的所有'yes'来实现所需结果?

5 个答案:

答案 0 :(得分:12)

要删除列表中'no'之前出现的所有'yes',您可以在Python 3中使用 list comprehension itertools.zip_longest(...) .x(相当于Python 2.x中的iterools.izip_longest(..)(默认fillvalueNone实现此目的:

>>> a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']

# Python 3.x solution
>>> from itertools import zip_longest
>>> [x for x, y in zip_longest(a, a[1:]) if not(x=='no' and y=='yes')]
['no', 'no', 'yes', 'yes', 'no']

# Python 2.x solution
>>> from itertools import izip_longest
>>> [x for x, y in izip_longest(a, a[1:]) if not(x=='no' and y=='yes')]
['no', 'no', 'yes', 'yes', 'no']

您可能有兴趣看一下zip_longest document说:

  

创建一个聚合来自每个迭代的元素的迭代器。如果迭代的长度不均匀,则使用fillvalue填充缺失值。迭代继续,直到最长的可迭代用尽。

答案 1 :(得分:4)

试试这个:

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
a = ' '.join(a)  
print(a.replace('no yes', 'yes').split(' '))

它做的是: 1.将列表合并为' '.join()的字符串 2.用a.replace()替换'是'的所有出现和'是' 3.将其拆分为包含a.split(' ')

的列表

答案 2 :(得分:4)

迭代条件并追加最后一项:

[i for i, j in zip(a, a[1:]) if (i == 'yes' or j == 'no')] + a[-1:]

答案 3 :(得分:3)

一种有趣的迂回方式,使用regexlook-ahead

>>> import re
>>> s = ' '.join(a)                          # convert it into string
>>> out = re.sub('no (?=yes)', '', s)        # remove
>>> out.split()                              # get back the list
=> ['no', 'no', 'yes', 'yes', 'no']

答案 4 :(得分:0)

试试这个代码!

我还附上了输出截图!

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
for i in range (1,5):
  if a[i]=='yes':
    j=i-1
    a.pop(j)

print(a)

输出:

enter image description here