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"