2013-07-19 48 views
0

我正在學習Python,並且正在努力滿足for循環的條件。我必須錯過簡單的東西。我有一個列表,其中包含一些int值,我想(1)打印所有偶數,(2)只打印某個索引值。我可以打印好偶數,但似乎無法打印到某個索引。帶有列表的Python(循環)

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. 打印所有號碼列表 - OK:

    for i in numbers: 
        print i 
    
  2. 打印列表中的所有偶數 - OK:

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

比方說,我只想打印甚至包括帶有val的條目的數字ü980 - 所以這將是402,984,360,408,980.

我已經嘗試過,但不成功,實施一個計數和while循環,也是一個條件,我打印numbers[n] < numbers.index(980)

+0

'的.index(...)'幾乎是無關緊要恕我直言;這並不是說沒有用,但我幾乎從不需要使用它。它的作用是找到第一個出現的數字,即'index(980)'會找到第一次出現在列表中的數字'980'的索引。 – ninjagecko

+0

你好,你的第二個循環不會工作,因爲x沒有定義。你的意思可能是'對於x的數字:如果x%2 == 0:打印x'。 –

回答

3

有一個break聲明這讓電流回路:

>>> for i in numbers: 
...  if i % 2 == 0: 
...   print i 
...  if i == 980: 
...   break 
... 
402 
984 
360 
408 
980 
+0

這就是它!非常感謝zch。 – bburn312

+0

@zch你也應該教導適當的變量命名:例如_number_而不是_i_('用數字表示......') –

3

使用enumerate() function爲包括環指數:

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 
+0

感謝您的快速回復,讓我更加確切,如果我不知道索引的位置,我想說只打印甚至包括索引980,而不是位置[:10]的值? – bburn312

+0

@ bburn312:不完全確定你在問什麼。 '我<980'測試指數高達980,你可以添加'和i!= 10'來跳過那個指數。 –

+0

@ bburn312:如果你的意思是'num == 980',那就測試一下,然後用一個'break'來救援。 –

0

兩種可能性:

第一用途enumerate,果然a, 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 

這第二種方法沒有第e首先是因爲它複製了該列表的片段(除非您正在對range(...)或其他「智能」對象進行切片,在這種情況下,它可能會返回一個「虛擬列表」)。但是,可以考慮更乾淨地閱讀,所以可以接受,除非您關心的部分很小或者您不關心內存或空間效率。

0

操縱名單,看看list comprehensions。特別是對於大型列表,它們比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 

順便說一句,InOut是從IPython,這是一個偉大的交互式Python環境。

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)