假设我有一个如下所示的列表:
myList = ['', '', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz']
我怎样才能删除
的所有实例''
在每个没有 '' 的元素之间。所以,我的新列表看起来像:
myNewList = ['', '', 'foo', 'bar', '', '', 'fizz', 'buzz']
我最初的想法是只使用 for 循环来识别单元格是否不是 '',然后像这样删除下一个元素:
myList = ['', '', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz']
for i in range(0, len(myList)):
if i != '' and myList[i]:
del(myList[i + 1])
但是,我的列表索引超出了范围。 请记住,这种模式自始至终都是一样的。每次有一个包含实际文本的元素时,它后面都会有一个额外的空行。
基本上我需要保留所有包含 '' 的元素,除非它们紧跟在包含文本的元素之后。
有什么建议吗?
请您参考如下方法:
myList = ['', '', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz']
from itertools import groupby, chain
def consec(l):
for k, v in groupby(l):
lst = list(v)
if len(lst) > 1 or lst[0]:
yield lst
myList[:] = chain.from_iterable(consec(myList))
print(myList)
输出:
['', '', 'foo', 'bar', '', '', 'fizz', 'buzz']
如果两个单词之间有一个空字符串,则返回一个空字符串的单个元素列表的唯一方法。您必须将开头和结尾视为特殊情况,但是一旦您决定在有单个前导或结尾空字符串时应该发生什么,就可以轻松添加该逻辑。如果你想在没有链的情况下做到这一点,你只需要迭代并产生每个元素:
def consec(l):
for k, v in groupby(l):
lst = list(v)
if len(lst) > 1 or lst[0]:
for ele in lst:
yield ele
myList[:] = (consec(myList))
print(myList)
如果您想捕获单个前导或尾随空字符串并希望保留它们,有几种方法,一种方法是使用枚举并检查循环外的最后一个列表:
from itertools import groupby, chain
def consec(l):
for ind, (k, v) in enumerate(groupby(l)):
lst = list(v)
if len(lst) > 1 or lst[0] or ind == 0:
yield lst
if len(lst) == 1 and not lst[0]:
yield lst
这应该适用于所有情况:
In [2]: myList = ['', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz', '',""]
In [3]: myList[:] = chain.from_iterable(consec(myList))
In [4]: myList
Out[4]: ['', 'foo', 'bar', '', '', 'fizz', 'buzz', '', '']
In [5]: myList = ['', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz', '']
In [6]: myList[:] = chain.from_iterable(consec(myList))
In [7]: myList
Out[7]: ['', 'foo', 'bar', '', '', 'fizz', 'buzz', '']
In [8]: myList = ['', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz']
In [9]: myList[:] = chain.from_iterable(consec(myList))
In [10]: myList
Out[10]: ['', 'foo', 'bar', '', '', 'fizz', 'buzz']
In [11]: myList = ['', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz', "",'foo',""]
In [12]: myList[:] = chain.from_iterable(consec(myList))
In [13]: myList
Out[13]: ['', 'foo', 'bar', '', '', 'fizz', 'buzz', 'foo', '']
