Python 3:从元组列表中删除空元组

时间:2013-12-06 00:03:45

标签: python list tuples

我有一个元组列表,如下所示:

>>>myList
[(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]

我想这样读:

>>>myList
[('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]

即。我想从列表中删除空元组()。在执行此操作时,我想保留元组('',)。我似乎找不到从列表中删除这些空元组的方法。

我已经尝试myList.remove(())并使用for循环来执行此操作,但要么不起作用,要么我的语法错误。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:7)

您可以过滤'空'值:

filter(None, myList)

或者你可以使用列表理解。在Python 3上,filter()返回一个生成器; list comprehension在Python 2或3上返回一个列表:

[t for t in myList if t]

如果您的列表包含的不仅仅是元组,您可以明确地测试空元组:

[t for t in myList if t != ()]

Python 2演示:

>>> myList = [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]
>>> filter(None, myList)
[('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]
>>> [t for t in myList if t]
[('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]
>>> [t for t in myList if t != ()]
[('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]

在这些选项中,filter()功能最快:

>>> timeit.timeit('filter(None, myList)', 'from __main__ import myList')
0.637274980545044
>>> timeit.timeit('[t for t in myList if t]', 'from __main__ import myList')
1.243359088897705
>>> timeit.timeit('[t for t in myList if t != ()]', 'from __main__ import myList')
1.4746298789978027

在Python 3上,坚持使用列表推导:

>>> timeit.timeit('list(filter(None, myList))', 'from __main__ import myList')
1.5365421772003174
>>> timeit.timeit('[t for t in myList if t]', 'from __main__ import myList')
1.29734206199646

答案 1 :(得分:4)

myList = [x for x in myList if x != ()]

答案 2 :(得分:3)

使用list comprehension过滤掉空元组:

>>> myList = [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]
>>> myList = [x for x in myList if x]
>>> myList
[('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'done', 'eats', 'cats', 'ears'), ('don',)]
>>>

这是有效的,因为空元组在Python中计算为False

答案 3 :(得分:1)

  

显式优于隐式

通过明确指定过滤器的功能,我发现这个更易读且不含糊。很明显,我们要删除那些()的空元组。

def filter_empty_tuple(my_tuple_list):
    return filter(lambda x: x != (), my_tuple_list)

# convert to list
def filter_empty_tuple_to_list(my_tuple_list):
    return list(filter(lambda x: x != (), my_tuple_list))

如果您不将它们转换为list并将其用作generator,那么也许会很好。 在决定使用哪个

时,请参阅此question