python元组删除_Python 3:从元组列表中删除空元组

I have a list of tuples that reads as such:

>>>myList

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

And I would like it to read as such:

>>>myList

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

i.e. I would like to remove the empty tuples () from the list. While doing this I want to preserve the tuple ('',). I cannot seem to find a way to remove these empty tuples from the list.

I have tried myList.remove(()) and using a for loop to do it, but either that doesn't work or I am getting the syntax wrong. Any help would be appreciated.

解决方案

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值