【问题标题】:Python: using "if not" on multiple itemsPython:在多个项目上使用“如果不是”
【发布时间】:2016-07-09 22:30:14
【问题描述】:

我可以在 Python 中做到这一点吗:

if not (list1, list2, list3):
    ...

检查所有给定的列表是否为空?

如果没有,我该怎么做?

【问题讨论】:

  • 你的技术行不通,因为它是空列表的非空元组......但非空元组总是“真实的”。

标签: python if-statement operators


【解决方案1】:
if not (list1 + list2 + list3):

【讨论】:

    【解决方案2】:

    具有至少一个元素的元组在布尔上下文中为真。这意味着not (list1, list2, list3) 始终是False。

    由于空列表是虚假的,您可以使用内置的any函数,如下所示

    if not any([list1, list2, list3]):
        # ...
    

    【讨论】:

      【解决方案3】:

      解决办法是:

      if not (list1 or list2 or list3):
      

      【讨论】:

      • 其实我很确定这个逻辑是错误的——“not”比“or”更接近。
      【解决方案4】:

      如果你想检查几个变量是否都是 None 或 False-like,你可以这样做:

      if not any(list1, list2, list3):
          print("All lists are empty")
      

      但是,这不适用于包含所有类似 false 值的列表(None、False、""、[] 等...)。如果你想这样做,你可以这样做:

      def allitems(lst):
          for x in lst:
              if isinstance(x, (list, tuple)):
                  for y in allitems(x):
                      yield y
              else:
                  yield x
      
      list1 = [None, [False], [False, [False, [None, False], False, None], [False, None]], False]
      print(any(allitems(list1)))  # => False
      

      这也适用于递归列表/元组。它确保其中的所有值都是 False-like。

      【讨论】:

        【解决方案5】:

        最流畅的方法是使用all高阶函数:

        if all(len(l) == 0 for l in (l1, l2, l3)): 打印“列表为空”

        这个检查在逻辑上更正确,因为它以一种可读的方式说明了你的意思。

        【讨论】:

          猜你喜欢
          • 2016-06-29
          • 2019-03-24
          • 2021-10-20
          • 2016-12-03
          • 1970-01-01
          • 2019-04-25
          • 2019-11-07
          • 2021-08-21
          • 2011-04-04
          相关资源
          最近更新 更多