假设我有一个列表:
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的)(具有默认fillvalue
的None
)来实现这一如下:
>>> 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(' ')