Python:如何从列表中删除空列表?

时间:2011-01-30 12:49:03

标签: python list

我有一个包含空列表的列表:

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']

如何删除空列表以便我得到:

list2 = ['text', 'text2', 'moreText']

我尝试了list.remove(''),但这不起作用。

9 个答案:

答案 0 :(得分:74)

尝试

list2 = [x for x in list1 if x != []]

如果你想摆脱所有“麻痹”的东西,例如空字符串,空元组,零,你也可以使用

list2 = [x for x in list1 if x]

答案 1 :(得分:54)

您可以使用filter()代替列表理解:

list2 = filter(None, list1)

如果None被用作filter()的第一个参数,它会过滤掉给定列表中的每个值,即布尔上下文中的False。这包括空列表。

它可能比列表理解稍快,因为它只在Python中执行单个函数,其余的在C中完成。

答案 2 :(得分:6)

使用filter调用None将过滤掉列表中的所有虚假值(空列表为)

list2 = filter(None, list1)

答案 3 :(得分:3)

一些选择:

filter(lambda x: len(x) > 0, list1)  # Doesn't work with number types
filter(None, list1)  # Filters out int(0)
filter(lambda x: x==0 or x, list1) # Retains int(0)

示例会话:

Python 2.7.1 (r271:86832, Nov 27 2010, 17:19:03) [MSC v.1500 64 bit (AMD64)] on
win32
Type "help", "copyright", "credits" or "license" for more information.
>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> filter(lambda x: len(x) > 0, list1)
['text', 'text2', 'moreText']
>>> list2 = [[], [], [], [], [], 'text', 'text2', [], 'moreText', 0.5, 1, -1, 0]
>>> filter(lambda x: x==0 or x, list2)
['text', 'text2', 'moreText', 0.5, 1, -1, 0]
>>> filter(None, list2)
['text', 'text2', 'moreText', 0.5, 1, -1]
>>>

答案 4 :(得分:3)

>>> list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
>>> list2 = [e for e in list1 if e]
>>> list2
['text', 'text2', 'moreText']

答案 5 :(得分:1)

我发现了这个问题,因为我想和OP一样。 我想补充以下观察:

迭代方式(user225312,Sven Marnach):

list2 = [x for x in list1 if x]

将在listpython3中返回python2个对象。相反,过滤方式(lunaryorn,Imran)将在版本上表现不同:

list2 = filter(None, list1)

它将返回filter中的python3对象和list中的python2(同时查看this question)。这是一个细微的差别,但在开发兼容的脚本时必须考虑到这一点。

这不会对这些解决方案的性能做出任何假设。无论如何,过滤器对象可以使用以下命令恢复为列表:

list3 = list(list2)

答案 6 :(得分:0)

我需要从更复杂的嵌套对象中过滤掉空项。我做了一个递归函数来做到这一点。请参阅my SO answer here

答案 7 :(得分:0)

#include <iostream>
#include <typeinfo>
using namespace std;

class Adi {
int a;
int b;
};

int main() {
Adi obj, obj2;
cout << typeid(obj2).name() << endl;
return 0;
}

输出:

list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
list2 = []
for item in list1:
    if item!=[]:
        list2.append(item)
print(list2)

答案 8 :(得分:0)

在上面的答案中,假设您有一个list of lists格式:

theList = [['a','b',' '],[''],[''],['d','e','f','g'],['']]

,您想从每个列表中取出空条目以及可以执行的空列表:

theList = [x for x in theList if x != ['']] #remove empty lists
for i in range(len(theList)):
    theList[i] = list(filter(None, theList[i])) #remove empty entries from the lists

您的新列表如下

theList = [['a','b'],['d','e','f','g']]