For 循环和多个条件

Posted

技术标签:

【中文标题】For 循环和多个条件【英文标题】:For loops and multiple conditions 【发布时间】:2011-09-02 06:55:48 【问题描述】:

在 C++ 中,可以这样说:

for (int i = 0; i < 100 && !found; i++) 
  if (items[i] == "the one I'm looking for")
    found = true;

所以你不需要使用“break”语句。

在 Python 中,我猜你需要编写:

found = False

for item in items:
    if item == "the one I'm looking for"
        found = True
        break

我知道我可以编写一个包含相同代码的生成器,这样我就可以隐藏这个中断的东西。但我想知道是否有任何其他方法可以在不使用额外变量或 while 循环的情况下实现相同的事情(具有相同的性能)。

我知道我们可以说:

found = "the one I'm looking for" in items

我只是想了解是否可以在 for 循环中使用多个条件。

谢谢。

【问题讨论】:

是的,在 C++ 中可以说您刚才所说的,但我向您保证,它并没有达到您的预期——逗号运算符评估其左侧参数(没有副作用此处),然后计算其右手参数并得出该值。 C++ 真的应该是:for (int i = 0; i &lt; 100 &amp;&amp; !found; ++i) 这取决于如果找不到该项目,您希望发生什么。 @Richard 是的,谢谢 :) 我修好了! @Matthieu 我知道,这只是比较 Python 和 C++ 中的 for 循环的一个例子。这不是要在循环中找到一个项目,它可能会更复杂。因此,在列表中查找项目并非如此。 【参考方案1】:

由于 Python 中的 for loops 迭代的是序列而不是条件和突变语句,因此 break 是提早退出的必要条件。换句话说,python 中的for 不是条件循环。与 C++ 的 for 等效的 Python 将是 while loop。

i=0
found=False
while i < 100 and !found:
    if items[i] == "the one I'm looking for":
        found=True
    i += 1

即使在 C++ 中,for loops can be rewritten as while loops 如果它们不包含 continue 语句。


    int i = 0;
    while (i < 100 && !found) 
        if (items[i] == "the one I'm looking for")
            found = true;
        i++;
    

【讨论】:

嗯,有人应该为此功能编写 PEP :) for 在 Python 中类似于 c# 中的 foreach,与 C、C++ 或 Java 中的 for 完全不同。 @Richard 是的,但如果有这个功能就好了。 @pocoa:类似 C 的 for 的 PEP 可能会因为不符合 Python 标准而被否决。 @pocoa:Lennart 可能对你的想法不友好,但他并不想批评你。你当然是有道理的,因为我们理解你。如果你在路上遇到一个想法,就把它打掉。【参考方案2】:

if 不是在 Python 中获得else 子句的唯一语句:

for item in items:
  if item == "the one I'm looking for":
    break
else:
  print "Item not found! Run away! Run away!"
  return
do_something_with(item)

whiletry 也有 else 子句。

【讨论】:

谢谢,但这不是我的问题 :) @Ignacio:截至目前,else 的缩进与if 的缩进不匹配。 @pocoa:有时 Python 会迫使您以不同的方式思考。这就是让来自其他语言的程序员感到困惑的地方。 @pocoa,您的问题询问如何将 C 习语翻译成 Python。这里的重点是,在真正的 Python 中,found 变量之类的变量并不经常需要,因为循环结构与 C(和其他语言)相似但不同。除非您乐于编写蹩脚的 Python 代码,否则了解这些差异很重要 @pocoa:简单的答案是“不”。更复杂的答案是“你不需要”。【参考方案3】:

这样的?

def search(match, items):
    for item in items:
        if item == match:
            return True
    return False

编辑:

def search(match, test, items):
    for item in items:
        if item == match and test(item) and the_sky_is_not_falling:
            return True
    return False

【讨论】:

是的,但这不是我想要的。我只是想了解 Python 是否支持 for 循环中的多个条件。 Python 根本不支持for 中的条件。 for 不处理条件。【参考方案4】:
>>> from itertools import dropwhile
>>> try:
...     item = next(dropwhile(lambda x: x!="the one I'm looking for", items))
...     found = True
... except:
...     found = False

当然你也可以在没有 lambda 函数的情况下这样写

>>> from itertools import dropwhile
>>> try:
...     item = next(dropwhile("the one I'm looking for".__ne__, items))
...     found = True
... except:
...     found = False

现在在我看来它是使用额外变量的 C 版本

如果你真的只需要找到的变量集(并且不需要知道项目),那么只需使用

found = any(item=="the one I'm looking for" for item in items)

【讨论】:

啊!后者真的很整洁。 @gnibber 我可以从你的帖子中学到一些新东西,所以我会接受你的回答。谢谢。【参考方案5】:

可以!

>>> found = False
>>> for x in (x for x in range(10) if not found):
...    print x
...    if x == 5:
...       print "Found!"
...       found = True
... 
0
1
2
3
4
5
Found!

但这很愚蠢,因为即使在找到 x 之后您仍继续循环,所以不要这样做。 :-)

【讨论】:

以上是关于For 循环和多个条件的主要内容,如果未能解决你的问题,请参考以下文章

C ++:for循环中的多个退出条件(多个变量):AND -ed或OR -ed?

for循环条件里冒号是啥作用

在 for 循环中包含多个条件

Bash for 具有多个条件的循环

drools when写条件判断时能加循环吗?我有多个条件要进行判断,而且条件的数量未知。

具有多个条件的 for 循环向量化