【问题标题】:How to compare all items in a list with an integer without using for loop如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较
【发布时间】:2012-03-04 12:33:03
【问题描述】:

我有几个长度不同的列表,我想将它们的每个项目与一个整数进行比较,如果其中任何一个项目高于所述整数,它会破坏它所在的 for 循环。

for list in listoflists:
    if {anyiteminlist} > 70:
        continue    #as in skip to next list

    {rest of code here} 

基本上,我需要说:“如果此列表中的任何内容超过 70,则继续循环下一个列表”

【问题讨论】:

  • 不使用嵌套for循环的原因是什么? list 具有的任何内部方法仍将使用 O(n) 搜索来找出是否有任何元素大于某个数字 (70)。如果您确实需要避免嵌套的 O(n) 搜索,请使用不同的/自定义数据结构。
  • 没关系,但在你的伪代码中你写“if {anyiteminlist} > 70: continue”,但是你写“如果这个列表中的任何东西低于 70,用下一个列表继续循环”。是我误读了,还是那些几乎相反?
  • 抱歉,我已修复。不,这不是家庭作业。

标签: python list for-loop


【解决方案1】:

不要使用list 作为变量名,它会影响内置的list()。有一个名为any 的内置函数在这里很有用

if any(x>70 for x in the_list):

() 之间的部分称为generator expression

【讨论】:

    【解决方案2】:

    好吧,我可能会使用生成器表达式来做,但是因为还没有其他人建议这样做,而且它没有(显式)嵌套循环:

    >>> lol = [[1,2,3],[4,40],[10,20,30]]
    >>> 
    >>> for l in lol:
    ...     if max(l) > 30:
    ...         continue
    ...     print l
    ... 
    [1, 2, 3]
    [10, 20, 30]
    

    【讨论】:

    • max 不会短路,但any 会 - 即列表中大于阈值的第一个元素将导致 any 评估为 True。 max 将查看每个值以找到最大值,即使列表的第一个元素超过了阈值,而其余元素实际上不需要查看。
    • @PaulMcGuire:是的。计算最大值的唯一可能优势是它避免了显式循环,而我能想到这样做的唯一原因是如果这是一个问题所要求的......(我并不是说这个问题在这里。 )
    • 我怀疑“无 for 循环”条件可能是由于有关如何从内循环内部继续外循环的问题。内循环中的“继续”只会继续内循环,而不是外循环。
    【解决方案3】:

    您可以像这样使用内置函数any

    for list in listoflists:
        if any(x < 70 for x in list):
            continue
    

    any 函数进行短路求值,因此一旦在列表中找到满足条件的整数,它就会返回True

    另外,你不应该使用变量list,因为it is a built-in function

    【讨论】:

      【解决方案4】:

      您可以将其缩短为:D

      for good_list in filter(lambda x: max(x)<=70, listoflists):
         # do stuff
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 python 2.5 或更高版本,则可以将 any() 函数与列表推导一起使用。

        for list in listoflists:
          if any([i > 70 for i in list]):
            continue
        

        【讨论】:

        • 您不需要或不希望在 any 中使用 list-comp:它可以防止短路。
        • for i in list 在我看来仍然像一个 for 循环。
        • @Alan - 它是一个生成器表达式,它使用for 来定义要生成的值。在这种形式中,它是一个在快速 C 代码中执行的 for 循环,而不是在慢速 Python 代码中。
        • @PaulMcGuire:这很有趣。我不知道。我只是指出原始问题(奇怪的是)没有嵌套 for 循环。无论如何,即使它实现得更快,或者在更快的硬件上执行,在某些时候 n^2 总是比 Nlog(n) 慢
        【解决方案6】:

        使用内置的any 是最清晰的方法。或者,您可以嵌套一个 for 循环并从中跳出(for-else 构造的少数用途之一)。

        for lst in listoflists:
            for i in lst:
                if i > 70:
                    break
            else:
                # rest of your code
                pass
        

        【讨论】:

          猜你喜欢
          • 2020-10-14
          • 2021-09-06
          • 2020-10-01
          • 2023-03-05
          • 2023-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多