如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较

Posted

技术标签:

【中文标题】如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较【英文标题】:How to compare all items in a list with an integer without using for loop 【发布时间】: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,用下一个列表继续循环”。是我误读了,还是那些几乎相反? 抱歉,我已修复。不,这不是家庭作业。 【参考方案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

【讨论】:

以上是关于如何在不使用 for 循环的情况下将列表中的所有项目与整数进行比较的主要内容,如果未能解决你的问题,请参考以下文章

如何让用户在不使用输入字段的情况下将文本输入 <li>? [关闭]

如何在不使用for循环的情况下从pyspark中的列表创建数据框?

如何在不跟踪索引的情况下将元素附加到列表?

如何在不跟踪索引的情况下将元素附加到列表中?

在不知道元素类型的情况下将项添加到列表中

如何在不影响 Flutter 中的原始列表的情况下将列表执行深层复制到另一个列表