【问题标题】:Finding the first list element for which a condition is true [duplicate]查找条件为真的第一个列表元素[重复]
【发布时间】:2013-06-02 12:21:17
【问题描述】:

我一直在寻找一种优雅(简短!)的方法来返回列表中与特定标准匹配的第一个元素,而不必评估列表中每个元素的标准。最终我想出了:

(e for e in mylist if my_criteria(e)).next()

有没有更好的方法?

更准确地说:有内置的 python 函数,如 all()any() - 也有类似 first() 的东西不是很有意义吗?出于某种原因,我不喜欢在我的解决方案中调用next()

【问题讨论】:

  • 为什么所有东西都必须是优雅的单线?创建一个具有有意义名称的函数并完成它。
  • python中没有first函数,但是很容易写:first = next;)

标签: python python-2.7


【解决方案1】:

怎么样:

next((e for e in mylist if my_criteria(e)), None)

【讨论】:

    【解决方案2】:

    不 - 看起来不错。我很想改写为:

    from itertools import ifilter
    next(ifilter(my_criteria, e))
    

    或者至少将计算分解为生成器,然后使用它:

    blah = (my_function(e) for e in whatever)
    next(blah) # possibly use a default value
    

    另一种方法,如果你不喜欢next

    from itertools import islice
    val, = islice(blah, 1)
    

    如果ValueError 是“空的”,那会给你一个例外

    【讨论】:

    • 对于那些在 Python 3 中看到这个的人,itertools.ifilter 现在只是 filter 并且在全局命名空间中可用。
    【解决方案3】:

    我建议使用

    next((e for e in mylist if my_criteria(e)), None)
    

    next(ifilter(my_criteria, mylist), None)
    

    【讨论】:

      【解决方案4】:

      带有for循环

      lst = [False,'a',9,3.0]
      for x in lst:
          if(isinstance(x,float)):
              res = x
              break
      
      print res
      

      【讨论】:

        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 1970-01-01
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多