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

dgr*_*379 6 python list

假设我有一个列表:

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
Run Code Online (Sandbox Code Playgroud)

在这里,我想删除每个'no'前面的每一个'yes'.所以我的结果列表应该是这样的:

['no', 'no', 'yes', 'yes', 'no']
Run Code Online (Sandbox Code Playgroud)

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

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
a.remove('no')
print a
Run Code Online (Sandbox Code Playgroud)

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

['no', 'no', 'yes', 'no', 'yes', 'no']
Run Code Online (Sandbox Code Playgroud)

如何通过删除列表中所有匹配项'no'前面的所有匹配项来实现所需的结果'yes'

Moi*_*dri 12

对于删除所有发生的'no'这是目前只是在之前'yes'您的列表中,你可以使用列表中理解itertools.zip_longest(...)在Python 3.X(这是相当于iterools.izip_longest(..)在Python 2.x的)(具有默认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']
Run Code Online (Sandbox Code Playgroud)

您可能有兴趣查看zip_longest文档说:

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


小智 4

尝试这个:

a = ['no', 'no', 'no', 'yes', 'no', 'yes', 'no']
a = ' '.join(a)  
print(a.replace('no yes', 'yes').split(' '))
Run Code Online (Sandbox Code Playgroud)

它所做的是: 1. 将列表合并为字符串' '.join() 2. 将所有出现的“no yes”替换为“yes” a.replace() 3. 将其拆分回列表a.split(' ')

  • 我发现这有 3 个问题:1)它只适用于字符串。2) 如果任何字符串包含空格,则会中断。3) 如果一个元素以“no”结尾(例如“anno”)或以“yes”开头(例如“yesterday”),则会中断。__也就是说__,它仍然比上面的正则表达式答案更好。 (8认同)