Skip to content Skip to sidebar Skip to footer

Python 3: Removing An Empty Tuple From A List Of Tuples

I have a list of tuples that reads as such: >>>myList [(), (), ('',), ('c', 'e'), ('ca', 'ea'), ('d',), ('do',), ('dog', 'ear', 'eat', 'cat', 'car'), ('dogs', 'cars', 'don

Solution 1:

You can filter 'empty' values:

filter(None, myList)

or you can use a list comprehension. On Python 3, filter() returns a generator; the list comprehension returns a list on either Python 2 or 3:

[t for t in myList if t]

If your list contains more than just tuples, you could test for empty tuples explicitly:

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

Python 2 demo:

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

Of these options, the filter() function is fastest:

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

On Python 3, stick to the list comprehension instead:

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

Solution 2:

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

Solution 3:

Explicit is better than implicit

I find this one is more readable and not ambiguous by specifying clearly what function of the filter is. So clearly we want to remove those empty tuple which is ().

deffilter_empty_tuple(my_tuple_list):
    returnfilter(lambda x: x != (), my_tuple_list)

# convert to listdeffilter_empty_tuple_to_list(my_tuple_list):
    returnlist(filter(lambda x: x != (), my_tuple_list))

Perhaps it would be good if you don't convert them into a list and use it as generator. See this question when deciding which to use

Post a Comment for "Python 3: Removing An Empty Tuple From A List Of Tuples"