如何在Python for循环中使用多个条件?

24

如何在Python的循环中使用多个条件?

for example in java:
    int[] n={1,2,3,4,6,7};
    for(int i=0;i<n.length && i<5 ;i++){
      //do sth
    }

python的for循环是如何实现这个的?


3
很有趣,我认为你的第一行也是代码“for example in java:”,因为它是Python中的循环语法,我以为'java'是集合或列表,而'example'是索引。我知道,我知道,我不应该发表有趣的评论,但我忍不住了。哈哈 - Devang
7个回答

31

Python的for循环本身不支持此功能。您可以使用break语句实现相同的效果:

n = [1, 2, 3, 4, 6, 7]

for i in n:
    if i >= 5:
        break
    # do something with i

在Python中,for实际上是一个迭代器(iterator)或可迭代对象(iterable object)的foreach。即使你只想重复特定次数,也是如此:

for i in range(1, 8):
    # do something with i
在Python 2.x中,上述的for循环会构建一个包含从1到7(包括1和7)的数字列表,然后遍历该列表;而在Python 3.x中,上述循环会获得一个“迭代器对象”,该对象一次提供一个值,其值为1到7(包括1和7)。(区别在于range()函数以及它返回的内容。在Python 2.x中,您可以使用xrange()来获取一个迭代器对象,而不是分配一个列表。)
如果你已经有一个要迭代的列表,直接迭代它比使用变量i索引该列表更好。如果您仍需要一个索引变量,则可以通过enumerate()来获得它,如下所示:
n = [3, 5, 10, "cat", "dog", 3.0, 4.0]  # list can contain different types
for i, value in enumerate(n):
    # we only want to process the first 5 values in this list
    if i >= 5:
        break
    # do something with value

编辑:解决上述问题的另一种方法是使用列表切片。

for value in n[:5]:
    # do something with value

如果n是一个列表,这段代码可以正常工作。这个for循环将会依次从列表中取出元素赋值给value变量,当处理完5个元素或者列表已经没有剩余元素的时候停止。即使请求的切片长度超过了实际列表的长度也不会出错。

如果想要使用上面的技巧但仍然希望代码可以与迭代器一起工作,可以使用itertools.islice()函数:

from itertools import islice

for value in islice(n, 5):
    # do something with value

这将适用于列表、迭代器、生成器和任何类型的可迭代对象。

与切片列表一样,for循环将获取最多5个值,并且请求一个比可迭代对象实际拥有的值更多的 islice() 不会报错。


14

您Java代码的直接等价物是一个while循环:

n = [1, 2, 3, 4, 6, 7]
i = 0
while i < len(n) and i < 5:
    # do sth
    i += 1

你也可以这样做:

n = [1, 2, 3, 4, 6, 7]
for x in n[:5]:
    # do sth

8

以下是使用for循环有两个或更多条件的一种方法,这就是实际问题所要求的。我的观点是,虽然可以完成,但不太符合Pythonic的编程方式,通常不应尝试逐行重写其他语言的代码。

from itertools import takewhile, count
n=[1,2,3,4,6,7]
for i in takewhile(lambda i:i<len(n) and i<5, count()):
     print(i)

2
虽然这可能不符合Python的风格,但它确实有一个优点,即在开始时使所有退出条件清晰明了。 - huggie

5
你可以使用相同的逻辑编写while循环(但在Python中,&&被拼写为and||被拼写为or)。或者,您可以使用迭代序列的for循环,然后添加额外的逻辑以退出循环。
在Python中,我们更喜欢不使用整数索引容器。这实际上会破坏我们的许多代码,因为我们不会在编译时检查数据类型,有些容器无法索引。想要索引容器已经是一种设计上的问题:事实上,所有元素都在一个连续的容器中意味着没有任何元素是“特殊的”,否则我们会将它们保持分开。迭代就是迭代,我们不应该刻意使其变得更加复杂。

3

Python中的for与基于C语法的语言中的for不同。在Python中,for遍历一个序列,而在C语言中,它循环执行直到条件不成立。这是一个重要的区别。

类似C语言的for可以被以下代码大致替换:

i = 0;
while (i < n.length && i < 5) {
    // do sth
    i++;
}

(有一些来自 breakcontinue 的复杂性,但现在让我们忽略它们。)这个重写还表明了在Python中实现你想要的方式:使用while
i = 0
while i < len(n) and i < 5:
    // do something
    i += 1

在您的特定情况下,使用适当的索引列表最容易使用for
for i in range(min(len(n), 5)):
    // do something

range会返回一个整数列表(0,1,2,...),你想要的是让列表增加到5或数组的长度,以较小者为准。上面的代码实现了这一点。


3
假设您想在循环中使用第i个n项目,enumerate 可以避免反复输入 n[i] - 值将存储在变量 item 中。
n = [1,2,3,4,6,7]
for i, item in enumerate(n):
  if i>=5:
    break
  # do something
  print item       # for example

请注意,如果n的长度小于5,则循环将自动终止。

for i, item in enumerate(n)[:5]:怎么样? - machine yearning
1
@machine,这涉及到制作该切片的副本。长度为5的切片将非常快,但对于更大的切片,这可能会消耗大量临时内存。如果n是迭代器,则也无法工作 - 但您可以使用islice。 - John La Rooy
@eryksun,也许他的意思是 enumerate(n[:5]) - John La Rooy
我之前没有测试过,以为enumerate返回一个列表。我的错。我喜欢你的方法,@eryksun:。 - machine yearning

1
在Python中,for语句迭代“列表”对象(我用引号括起来是因为我指的是通用意义上的列表,它可以迭代任何可迭代的东西)。
要编写条件循环(而不是迭代到完成),请使用while:
n = [1, 2, 3, 4, 6, 7]
i = 0
while i < len(n) and i < 5:
    # do stuff
    i += 1

现在为了完整起见,你的例子也可以写成:

n = [1, 2, 3, 4, 6, 7]
for i in range(0,min(len(n),5)):
    # do stuff

或者:

n = [1, 2, 3, 4, 6, 7]
for i in range(0,len(n)):
    if i >= 5:
        break
    # do stuff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接