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

Estoy empezando a incursionar en Python, y he empezado a leer los capítulos de learnpython.org. En el capítulo ‘Loops’, 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 problema fácil (supongo), debería ser posible SECAR, ¿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 

Eso es lo que else y elif son para:

 for x in numbers: if x == 237: break elif x % 2 == 0: print x 

Otro método es usar itertools que siempre es útil de alguna manera 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] 

Así que creamos un iterador perezoso que se detiene en 237, luego tomamos de esos 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 

Solo estoy pasando este ejercicio en mi “aprender lo básico” y salí con una solución similar pero de alguna manera peor, patrik 🙁

x = 0 for loop in numbers: if (numbers[x]) % 2 ==0: print (numbers[x]) x = x+1
if (numbers[x]) ==237: break
else: x =x+1 continue

Puedes hacerlo usando la lista de comprensión.

La solución sería así:

 numbers = [x for ind,x in enumerate(numbers) if x % 2== 0 and numbers[ind+1]!=237 ] 

3 si es y listo 🙂

  if x % 2 == 0: print x if x == 237: break if x % 2 != 0: continue 

Salida

 402 984 360 408 980 544 390 984 592 236 942 386 462 418 344 236 566 978 328 162 758 918