【问题标题】:Filtering a list of tuples filled with None in python在python中过滤用None填充的元组列表
【发布时间】:2016-05-05 07:32:38
【问题描述】:

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

my_list = [(2, 3), (3, None), (None, None), (3, 4), (None, 2)]

如何过滤此列表以便:

  1. 删除所有包含至少一个的元组None
  2. 只删除两个值都是None的元组

所以每种情况下的结果应该是:

  1. [(2, 3), (3, 4)]
  2. [(2, 3), (3, None), (3, 4), (None, 2)]

【问题讨论】:

    标签: python list python-2.7 filter


    【解决方案1】:

    使用list comprehensions 过滤您的具体情况:

    no_none = [t for t in my_list if None not in t]
    some_none = [t for t in my_list if t != (None, None)]
    

    请注意,过滤会选择 符合您的条件的元素,因此第一个选择不包含 None 的所有元组,第二个选择不等于 @ 的所有元组987654324@元组。

    演示:

    >>> my_list = [(2, 3), (3, None), (None, None), (3, 4), (None, 2)]
    >>> [t for t in my_list if None not in t]
    [(2, 3), (3, 4)]
    >>> [t for t in my_list if t != (None, None)]
    [(2, 3), (3, None), (3, 4), (None, 2)]
    

    【讨论】:

    • 谢谢!像魅力一样工作!
    【解决方案2】:

    您可以使用all 确保所有不是None,您可以使用any 作为表达式:任何值都不是None

    >>> my_list = [(2,3), (3,None), (None,None), (3,4), (None,2)]
    >>> filter(lambda x:all(i is not None for i in x), my_list)
    [(2, 3), (3, 4)]
    >>> filter(lambda x:any(i is not None for i in x), my_list)
    [(2, 3), (3, None), (3, 4), (None, 2)]
    

    【讨论】:

    • all() 即使在任意长度的情况下也不是必需的; None not in x 不关心 x 中有多少元素。 :-)
    • @MartijnPieters 当我们有超过 2 个元素并且我们不能为第二种情况写 (None, None) 时,可能需要任何东西
    猜你喜欢
    • 1970-01-01
    • 2023-01-14
    • 2020-09-17
    • 1970-01-01
    • 2021-03-21
    • 2022-12-04
    • 2020-09-20
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多