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