【问题标题】:Is it possible to check that a list is not empty before grabbing the first element using as few lines as possible in Python?是否可以在 Python 中使用尽可能少的行来检查列表是否为空?
【发布时间】:2010-11-21 10:39:53
【问题描述】:

我不得不在我的 python 代码中到处执行此操作。我敢打赌,有一种更简单(又名单线)的方法可以做到这一点。

results = getResults()
if len(results) > 0:
    result = results[0]

我实际上在其他任何地方都不需要“结果”,我应该只运行一次“getResults”。

有什么想法吗?

【问题讨论】:

  • 请注意,在推荐的 Python 样式指南 (PEP 8) 中,方法应命名为 get_results 而不是 getResults

标签: python


【解决方案1】:

如果results 为空,您尚未指定result 应该是什么,但这是一种选择(假设Python 2.6 或更高版本):

result = results[0] if results else None

【讨论】:

    【解决方案2】:

    result = len(results) and results[0] or None。如果 results[0] 不是0,或False,或任何空容器[], (), '', {}, set(), ...

    【讨论】:

    • 我认为您应该更清楚地说明,这results[0] 评估为 True 时才有效。如果results == range(10),比如说,它会给None。
    • @katrielex 我的评论(帖子中的第二句话)没有说清楚?
    • @khachik:没有。 Any 空容器评估为 False -- set(), tuple(), {}, frozenset(), 0.0, ... -- any i> 其中。
    • @khachik: close =) 但不幸的是不是真的... a) 0j, 0L, 0.0 和 b) 任何类都可以定义一个返回 False 的 __nonzero__ 方法,在这种情况下,该类的实例将评估为 False。关键是 anything 评估为 False 将导致失败。 [虽然现在我只是在吹毛求疵;这些充其量不太可能出现。]
    • @katrielalex 我明白这一点,谢谢 :) 在 3.x 中也有 __bool__,没有...因为使用了 and,这不是很明显吗?
    【解决方案3】:

    next(iter(getResults()), None) 用于 Python 2.6

    【讨论】:

      【解决方案4】:

      如果您实际上在任何地方都不需要results,请考虑一个只返回第一个结果的函数,然后使用它。

      def getFirstResult():
          results = getResults()
          if len(results) > 0:
              return results[0]
          else:
              return None
      

      【讨论】:

        【解决方案5】:

        如果您可以按照以下方式稍微更改getResults()

        def getResults():
            # ...
            getResults.seq = ... # save results in a func attribute
            return getResults.seq
        

        它可以让你写:

        results = getResults.seq[0] if getResults() else None
        

        【讨论】:

        • getResults 只是一个例子。每当我使用它时,它实际上会是一个不同的功能,而且我不想每次使用它时都必须编写一个包装器。
        • @Joehillen:这不是一个包装器,它是对函数本身的永久更改,它与以前的用法向后兼容,但也允许在需要时使用单行示例用法。也可以在不修改函数的情况下做到这一点——见问题pythonic way to rewrite an assignment in an if statement
        猜你喜欢
        • 1970-01-01
        • 2015-02-17
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 2017-02-16
        • 1970-01-01
        • 2020-04-19
        • 1970-01-01
        相关资源
        最近更新 更多