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

时间:2016-03-18 10:21:28

标签: python list python-2.7

我们说我的列表如下所示:

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])

但是,我的列表索引超出了范围。 请记住,此模式在整个中是相同的。每次有一个包含实际文本的元素时,后面都会有一个空白行。

基本上我需要保留包含''的所有元素。除非它们直接位于包含文本的元素之后。

有什么建议吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

您可以使用以下简单代码

myList = ['', '', 'foo', '', 'bar', '', '', 'fizz', '', 'buzz']
newList = [myList[0]]

for i in xrange(len(myList)-2):
    if myList[i+1] != '' or myList[i] == '' or myList[i+2] == '':
        newList.append(myList[i+1])

newList.append(myList[-1])
print newList

结果:

['', '', 'foo', 'bar', '', '', 'fizz', 'buzz']