2012-02-13 43 views
1

我有几个列表的长度不同,我想比较他们的每个项目与整数,如果任何一个项目上面所说的整数,它打破了for循环,它是在如何比较列表中的所有项目与整数,而不使用for循环

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

    {rest of code here} 

基本上,我需要说:“如果在此列表中任何高于70,继续循环的下一个列表”

+1

这功课吗? – 2012-02-13 02:43:39

+0

不使用嵌套for循环的原因是什么?列表中的任何内部方法仍将使用O(n)搜索来确定任何元素是否大于某个数字(70)。如果您确实需要避免嵌套的O(n)搜索,请使用其他/自定义数据结构。 – Alan 2012-02-13 02:43:58

+0

这并不重要,但是在你写的伪代码中,“如果{anyiteminlist}> 70:继续”,但是你写下“如果这个列表中的任何东西* *下面是* 70,继续循环下一个列表”。我误读了,还是那些几乎相反的东西? – DSM 2012-02-13 02:47:07

回答

1

那么这里

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] 
+3

'max'不会短路,但会有任意一个 - 也就是说,列表中的第一个元素大于阈值将导致任意'评估为真。即使列表中的第一个元素超过了阈值,其他值并不需要查看,max'也会查看每个值以查找最大值。 – PaulMcG 2012-02-13 03:35:58

+0

@PaulMcGuire:是的。计算最大值的唯一可能的好处是它避免了一个明确的循环,我能想到的唯一原因就是如果这是一个问题所要求的。(我在这里并不是指这个问题。 ) – DSM 2012-02-13 03:38:08

+1

我怀疑“否for循环”条件可能是由于如何从内部循环内部继续外部循环的问题。内部循环中的“继续”将继续内部循环,而不是外部循环。 – PaulMcG 2012-02-13 04:41:31

0

如果你使用python 2.5或更高版本,你可以使用any()函数和列表解析。

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

您不需要或不需要任何内部的list-comp:它可以防止短路。 – DSM 2012-02-13 02:45:07

+0

'为我在列表中'仍然看起来像一个for循环给我。 – Alan 2012-02-13 02:45:31

+0

@Alan - 它是一个使用'for'来定义要生成的值的生成器表达式。在这种形式下,它是一个用快速C代码执行的for循环,而不是慢速Python代码。 – PaulMcG 2012-02-13 03:38:58

1

您可以使用内置的功能any这样的:

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

any功能不短路计算,所以会尽快返回True在列表中的整数被发现符合条件。

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

0

使用内置的any是最清晰的方式。或者,您可以嵌套for循环并打破它(for-else构造的几个用法之一)。

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

不要使用list作为变量名,它屏蔽了该内建list()。有一个叫any内置函数,它是被称为generator expression

+0

完美谢谢! – rptynan 2012-02-13 03:01:37

1

可以缩短到这一点:d

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