0

我正在学习 Python,并在for循环条件下苦苦挣扎。我一定错过了一些简单的东西。我有一个包含一些 int 值的列表,我想 (1) 打印所有偶数和 (2) 只打印不超过某个索引的值。我可以很好地打印偶数,但似乎不能只打印到某个索引。

numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345]
  1. 打印列表中的所有数字——好的:

    for i in numbers:
        print i
    
  2. 打印列表中的所有偶数——好的:

    for i in numbers:
        if i % 2 == 0:
            print i
    

假设我只想打印直到并包括值为 980 的条目的偶数 - 所以这将是 402、984、360、408、980。

我曾尝试实现一个 count 和 while 循环以及一个条件 where I print ,但未成功numbers[n] < numbers.index(980)

4

5 回答 5

3

有一个break离开当前循环的语句:

>>> for i in numbers:
...     if i % 2 == 0:
...         print i
...     if i == 980:
...         break
... 
402
984
360
408
980
于 2013-07-19T12:14:47.863 回答
3

使用该enumerate()函数包含一个循环索引:

for i, num in enumerate(numbers):
    if num % 2 == 0 and i < 10:
        print num

或者,只需对列表进行切片以仅考虑第一个n元素,尽管这会创建子列表的新副本:

for num in numbers[:10]:
    if num % 2 == 0:
        print num

如果您需要测试 的特定值num,您也可以for提前退出循环break

for i, num in enumerate(numbers):
    if num % 2 == 0:
        print num
    if num == 980 or i >= 10:
        break  # exits the loop early
于 2013-07-19T12:12:16.257 回答
0

要操作列表,请查看列表推导。特别是对于大型列表,它们比 for 循环快得多。

根据您的numbers列表,您可以像这样隔离偶数:

In [3]: even = [n for n in numbers if n % 2 == 0]

In [4]: even
Out[4]: [402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328]

在这种情况下,您可以这样做:

for i in even:
    print i

对于你的第二个问题:

In [7]: selection = [n for i, n in enumerate(numbers) if n % 2 == 0 and i < numbers.index(980)]

In [8]: selection
Out[8]: [402, 984, 360, 408]

所以你可以做

for n in selection:
    print n

顺便说一句,Inand Outare from IPython,这是一个很棒的交互式 Python 环境。

于 2013-07-19T12:27:48.857 回答
0

itertools是一个具有很多奇妙功能的模块:

from itertools import takewhile

numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345]

for number in (number for number in takewhile(lambda x: x != 980, numbers) if number % 2 == 0):
    print(number)

添加更多 itertools 函数:

from itertools import ifilterfalse, takewhile
for number in ifilterfalse(lambda x: x % 2, takewhile(lambda x: x != 980, numbers)):
    print(number)
于 2013-07-19T12:55:01.997 回答
0

两种可能:

第一次使用enumeratea, b, c...变成(0,a) (1,b) (2,c) ...

for i,n in enumerate(numbers):
    if i==last_index:
        break
    print n

第二种可能性使用切片,它创建另一个列表,表示原始列表的一部分:

for n in numbers[:last_index]:
    print n

第二种方法不如第一种有效,因为它会复制列表的切片(除非您正在切片range(...)或其他“智能”对象,在这种情况下它可能会返回“虚拟列表”)。但是,可以考虑更清晰地阅读,因此可能是可以接受的,除非您关心的部分很小或者您不关心内存或空间效率。

于 2013-07-19T12:12:33.717 回答