2010-11-12 26 views
5

¿Cómo creo una lista y solo extraigo o busco los números pares en esa lista?pares números una lista?

Crear una función even_only(l) que toma una lista de números enteros como único argumento. La función devolverá una nueva lista que contiene todos (y solo) los elementos de l que son divisibles por igual por 2. La lista original l no se modificará.

Para ejemplos, even_only([1, 3, 6, 10, 15, 21, 28]) deberían volver [6, 10, 28] y even_only([1, 4, 9, 16, 25]) deberían volver [4, 16].

Consejo: Para comenzar, cree una lista vacía, y cuando se encuentra con un número par en el mismo, agregarlo a su lista, luego, al final, el retorno de su lista.

+2

lo único que se me ocurre es usar un bucle for en la función donde el rango de la entrada será probado para ver si es divisible por 2 de manera uniforme. –

+0

Deberías buscar la división modular que te ayudará muchísimo. Además, la "creación de una lista vacía" es factible, pero también puede ver el filtro. –

+1

@justin: Esto está totalmente bien. Si desea ayuda más específica, escriba un código y muéstrenos qué no funciona. –

Respuesta

10

"a mano":

def even_only(lst): 
    evens = [] 
    for number in lst: 
     if is_even(number): 
      evens.append(number) 
    return evens 

Pythonic:

def even_only(iter): 
    return [x for x in iter if is_even(x)] 

Como es su tarea, puede completar la función is_even.

+0

carece de un evens de retorno en el primer ejemplo –

+0

Qué error tan estúpido. Gracias por captar eso, Xavier. –

+0

Gracias por el algoritmo, me di cuenta a mano =) –

7

La manera más simple sería hacer lo que publicaste en un comentario: recorre la lista de entradas para encontrar dígitos divisibles por 2, y agrégalos a la lista de devolución si es así.

La función list.append(x) le ayudará a agregar un elemento a una lista.

También como se ha mencionado, mira en el uso de la operación modulo para determinar si un número es divisible por 2 ...

+0

¿Alguna idea sobre cómo usar el rango de una lista cuando solo acepta números enteros? –

2

La mejor manera de hacer esto (como un principiante) es probablemente una lista por comprensión. Dado que se trata de una tarea, no lo hará por usted, pero aquí es la sintaxis:

[x for x in your_list if (your condition)] 

Sólo hay que sustituir (su condición), con lo que se ajusta bien (básicamente, exactamente lo que se describe).

P.S. Sé que algunas personas pueden decir que las listas de comprensión son un poco avanzadas para un principiante, pero creo que no es un concepto demasiado difícil de captar y extremadamente útil.

+0

conocer un bucle 'for' sería mucho más útil para él, dado que existe un bucle for en casi cualquier lenguaje de programación, que no es el caso de la lista comprensiones –

+0

Tengo que preguntarme: ¿de verdad crees que alguien en CS101 que no sabe cómo decir incluso de extraño debe estar cerca de la lista de comprensión? Le está dando una dosis de dinamita a alguien que aún no tiene claro el propósito de una mecha. –

+0

Por supuesto, él debe saber qué es un bucle for, eso no significa que tenga que omitir las listas de comprensión. No son nada difíciles de entender, son extremadamente comunes en el código de Python, etc. Y como no existe en todos los lenguajes de programación, no significa que deba aprenderse al final. –

2

utilizar la función filter hacer esto de una manera funcional:

>>> even_filter = lambda x: not x % 2 
>>> result = filter(even_filter, [0, 1, 2, 3, 4]) 
>>> assert result == [0, 2, 4] 

Editar: actualizado con la paridad correcta de cero por el comentario de Vicente.

+2

Hasta donde yo sé, 0 es par (http://en.wikipedia.org/wiki/Parity_of_zero) –

2
>>> a = [1, 3, 6, 10, 15, 21, 28] 
>>> b = [i for i in a if i%2 ==0 ] 
>>> b 
[6, 10, 28] 
>>> a 
[1, 3, 6, 10, 15, 21, 28] 
+0

cerca pero solo imprime la lista original. –

+0

¿Qué imprime solo la lista original? – Falmarri

+0

esta es la mejor respuesta – clg4

2
>>> even_only = lambda seq : [ x for x in seq if str(x)[-1] in "02468" ] 
>>> even_only([1, 3, 6, 10, 15, 21, 28]) 
[6, 10, 28] 
+0

Hmmm ... conversión de cadenas en una función anónima que verifica las indicaciones negativas .... como una respuesta a la tarea. ¡Así que * no * tendría escrito el plagio por todas partes! ': D + 1' – Droogans

1

Recientemente tuve este problema y se utiliza:

list=[1,2,3,4,5,6] #whatever your list is, just a sample 
evens=[x for x in list if np.mod(x,2)==0] 
print evens 

retornos [2,4,6]

-1

All = (1, 3, 6, 10, 15, 21, 28] Desde la importación de itertools hasta Evenonly = takewhile (lambda x: x% 2 == 0, Todo) Imprimir (mostrar (Evenonly)

Cuestiones relacionadas