我们说我有一个列表:
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'
来实现所需结果?
答案 0 :(得分:12)
要删除列表中'no'
之前出现的所有'yes'
,您可以在Python 3中使用 list comprehension 和itertools.zip_longest(...)
.x(相当于Python 2.x中的iterools.izip_longest(..)
)(默认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']
您可能有兴趣看一下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)
一种有趣的迂回方式,使用regex
和look-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)