Imprime todos los números pares en una lista hasta un número determinado

Resuelto InanisAtheos asked hace 11 años • 6 respuestas

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
InanisAtheos avatar Jan 26 '13 19:01 InanisAtheos
Aceptado

Para eso elsey elifson:

for x in numbers:
  if x == 237:
    break
  elif x % 2 == 0:
    print x
Eric avatar Jan 26 '2013 12:01 Eric

Otro método es el uso itertoolsque 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.

Jon Clements avatar Jan 26 '2013 12:01 Jon Clements

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
tzelleke avatar Jan 26 '2013 13:01 tzelleke