我有一个包含空列表的列表:
list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText']
如何删除空列表以便我得到:
list2 = ['text', 'text2', 'moreText']
我尝试了list.remove(''),但这不起作用。
答案 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]
将在list
和python3
中返回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']]