Imprime todos los números pares en una lista hasta un número determinado
Recién estoy comenzando a incursionar en Python y he comenzado a leer los capítulos en learnpython.org. En el capítulo 'Bucles', resolví el desafío con el siguiente código. Sin embargo, no estoy seguro de que sea el más eficiente. Ciertamente no parece ser así, ya que tengo que definir el "número para no ir más allá" dos veces. En este (supongo) problema fácil, debería ser posible cumplir con DRY, ¿verdad?
El ejercicio es
Recorra e imprima todos los números pares de la lista de números en el mismo orden en que se reciben. No imprima ningún número que venga después de 237 en la secuencia.
Mi código:
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, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527 ]
# My Solution
for x in numbers:
if x != 237:
if x % 2 == 0:
print x
if x == 237:
break
Para eso else
y elif
son:
for x in numbers:
if x == 237:
break
elif x % 2 == 0:
print x
Otro método es el uso itertools
que siempre resulta útil de una forma u otra:
>>> from itertools import takewhile, ifilter
>>> not_237 = takewhile(lambda L: L != 237, numbers)
>>> is_even = ifilter(lambda L: L % 2 == 0, not_237)
>>> list(is_even)
[402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328, 162, 758, 918]
Entonces creamos un iterador perezoso que se detiene en 237, luego tomamos de ahí los números pares.
Esto también es posible:
try:
i = numbers.index(237)
except:
i = len(numbers)
for n in numbers[:i]:
if not n%2:
print n