我有几个列表的长度不同,我想比较他们的每个项目与整数,如果任何一个项目上面所说的整数,它打破了for循环,它是在如何比较列表中的所有项目与整数,而不使用for循环
for list in listoflists:
if {anyiteminlist} > 70:
continue #as in skip to next list
{rest of code here}
基本上,我需要说:“如果在此列表中任何高于70,继续循环的下一个列表”
我有几个列表的长度不同,我想比较他们的每个项目与整数,如果任何一个项目上面所说的整数,它打破了for循环,它是在如何比较列表中的所有项目与整数,而不使用for循环
for list in listoflists:
if {anyiteminlist} > 70:
continue #as in skip to next list
{rest of code here}
基本上,我需要说:“如果在此列表中任何高于70,继续循环的下一个列表”
那么这里
if any(x>70 for x in the_list):
的部分插图中的(
和)
有用的,我可能会不使用生成的表达,但因为没有一个其他人认为这还没有,它没有一个(明确的)嵌套循环:
>>> 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'不会短路,但会有任意一个 - 也就是说,列表中的第一个元素大于阈值将导致任意'评估为真。即使列表中的第一个元素超过了阈值,其他值并不需要查看,max'也会查看每个值以查找最大值。 – PaulMcG 2012-02-13 03:35:58
@PaulMcGuire:是的。计算最大值的唯一可能的好处是它避免了一个明确的循环,我能想到的唯一原因就是如果这是一个问题所要求的。(我在这里并不是指这个问题。 ) – DSM 2012-02-13 03:38:08
我怀疑“否for循环”条件可能是由于如何从内部循环内部继续外部循环的问题。内部循环中的“继续”将继续内部循环,而不是外部循环。 – PaulMcG 2012-02-13 04:41:31
如果你使用python 2.5或更高版本,你可以使用any()函数和列表解析。
for list in listoflists:
if any([i > 70 for i in list]):
continue
您可以使用内置的功能any这样的:
for list in listoflists:
if any(x < 70 for x in list):
continue
的any
功能不短路计算,所以会尽快返回True
在列表中的整数被发现符合条件。
此外,您不应该使用变量list
,因为it is a built-in function。
使用内置的any
是最清晰的方式。或者,您可以嵌套for循环并打破它(for-else构造的几个用法之一)。
for lst in listoflists:
for i in lst:
if i > 70:
break
else:
# rest of your code
pass
不要使用list
作为变量名,它屏蔽了该内建list()
。有一个叫any
内置函数,它是被称为generator expression
完美谢谢! – rptynan 2012-02-13 03:01:37
可以缩短到这一点:d
for good_list in filter(lambda x: max(x)<=70, listoflists):
# do stuff
这功课吗? – 2012-02-13 02:43:39
不使用嵌套for循环的原因是什么?列表中的任何内部方法仍将使用O(n)搜索来确定任何元素是否大于某个数字(70)。如果您确实需要避免嵌套的O(n)搜索,请使用其他/自定义数据结构。 – Alan 2012-02-13 02:43:58
这并不重要,但是在你写的伪代码中,“如果{anyiteminlist}> 70:继续”,但是你写下“如果这个列表中的任何东西* *下面是* 70,继续循环下一个列表”。我误读了,还是那些几乎相反的东西? – DSM 2012-02-13 02:47:07