Skip to main content
 首页 » 编程设计

python之如何删除列表中非空白元素之间的空白元素

2025年05月04日28me-sa

假设我有一个如下所示的列表:

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', '']