2013-07-19 3 views
0

Я изучаю Python и борюсь с условиями цикла for. Я должен пропустить что-то простое. У меня есть список с некоторыми значениями int, и я хочу (1) распечатать все четные числа и (2) печатать только значения до определенного индекса. Я могу напечатать четные цифры в порядке, но не могу напечатать только определенный индекс.Python (loop) со списком

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. Печатает все четные числа в списке - ки:

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

Скажет Я хочу только печатать четные числа до и включая запись с val ue 980 - так что это было бы 402, 984, 360, 408, 980.

Я попытался, безуспешно, реализовать цикл count и while, а также условное, где я печатаю numbers[n] < numbers.index(980).

+0

'.index (...)' практически не имеет значения имхо; это не значит, что это не полезно, но я почти никогда не использовал его. То, что он делает, это найти первое вхождение числа, то есть 'index (980)' будет находить индекс первого раза, когда число «980» появилось в списке. – ninjagecko

+0

Здравствуйте, ваш второй цикл не работает, потому что x не определен. Вы имеете в виду, вероятно, 'для x в числах: если x% 2 == 0: print 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: Не совсем уверен, что вы просите. 'i <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 

Этот второй метод не так эффективен, как сначала, так как он делает копию фрагмента списка (если вы не нарезаете range(...) или другой «умный» объект, и в этом случае он может вернуть «виртуальный список»). Однако его можно считать более чистым, так что это может быть приемлемым, если секция, о которой вы заботитесь, невелика, или вы не заботитесь об эффективности памяти или пространства.

0

Для работы со списками, посмотрите на list comprehensions. Особенно с большими списками, они намного быстрее, чем для циклов.

Основываясь на вашем 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 

BTW, In и Out от 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) 
Смежные вопросы