如何在不使用 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>? [关闭]