2012-06-27 50 views
7

Básicamente necesito ayuda en la generación de los números pares de una lista que he creado en Python:Generar una lista de los números pares en Python

[1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, ...] 

He probado un par de métodos diferentes, pero cada vez que se imprime, hay números impares mezclados con los pares!

Sé cómo generar números pares/impares si tuviera que hacer un rango de 0-100, sin embargo, obtener solo los números pares de la lista mencionada anteriormente me ha dejado perplejo.

P.S. Solo he estado usando Python durante un par de días, si esto resulta ser extremadamente simple, ¡gracias de antemano!

EDIT: Gracias por todas las respuestas, con su ayuda he superado este pequeño problema. Esto es lo que terminó con al completar un poco de ejercicio pidiendo a sumar los números pares de secuencia de Fibonacci:

F = [1, 2] 
while F[-1] < 4000000 
    F.append(F[-1] + F[-2]) 

sum(F[1::3]) 
4613732 
+0

solamente incluyen el número en su lista de objetivos si es divisible por 2. –

+4

¿Cuáles fueron los diferentes métodos que has intentado? – geoffspear

+3

Un poco extraño que haya logrado generar una secuencia de Fibonacci antes de poder filtrar una lista ...;) –

Respuesta

4

El siguiente ejemplo debería resolver su problema.

Newlist = [] 
for x in numList: 
    if x % 2 == 0: 
     print x   
     Newlist.append(x) 
+0

Esto es si desea imprimir todos los números pares; si desea obtener una lista con la que pueda trabajar, consulte las respuestas a continuación. Editar: Veo que la nueva versión lo agrega a una nueva lista :) –

1

iterar a través de la lista y utilizar el operador de módulo para comprobar incluso

for number in list: 
    if (number % 2) == 0: 
     ##EVEN 
+0

nah, la lista de comprensiones es mucho mejor para este tipo de cosas –

+0

de acuerdo ... Nunca las había visto antes. Se ven rápido y eficiente! – javajavajava

14

Utilice una lista por comprensión (véase: Searching a list of objects in Python)

myList = [<your list>] 
evensList = [x for x in myList if x % 2 == 0] 

Esto es bueno, ya que deja la lista intacta , y puedes trabajar con evensList como un objeto de lista normal.

Espero que esto ayude!

+1

Este es el más limpio. Me ganaste, tienes un voto positivo. –

+0

Creo que la comprensión de la lista puede ser un poco avanzada para los primeros días con Python ... ¡pero esa es solo mi opinión! – Trufa

+0

Las comprensiones de la lista Trufa son una de las mejores partes de Python ... ¿por qué no presentarlas temprano? –

3

En su caso específico my_list[1::3] funcionará. Siempre hay dos enteros impares entre números enteros pares de Fibonacci: par, impar, par, impar, extraño, impar .....

>>> my_list = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368] 
>>>   
... 
>>> my_list[1::3] 
[2, 8, 34, 144, 610, 2584, 10946, 46368] 
+0

Este caso funciona, pero como se basa en cortar y avanzar por índice no es una solución portátil. – jathanism

+0

Veo que estás cortando la lista, ¿pero hay dos dos puntos? ¿Cómo se llama este método? –

+1

@Erty - El tercer número es el "paso". Comienzas en el primer elemento y luego tomas cada tercer elemento después de eso. – mgilson

0

Puede utilizar list comprehension para generar una nueva lista que contiene sólo los miembros incluso de su lista original.

data = [1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144] 

a continuación:

new_data = [i for i in data if not i%2] 

produce

[2, 8, 34, 144] 

o utilizar una expresión generador si no es necesario que todos los números a la vez:

new_data = (i for i in data if not i%2) 

Los valores t uando se availabe, según sea necesario, por ejemplo si se ha utilizado un bucle for:

por ejemplo,

for val in new_data: 
    print val 

La ventaja de la expresión generadora es que la lista entera no se genera y se almacena en la memoria a la vez, pero los valores se generan a medida que los necesita, lo que reduce la demanda de memoria.Hay otras diferencias importantes que tal vez desee leer en algún momento si está interesado.

2

Usted puede hacer esto con a list comprehension:

evens = [n for n in numbers if n % 2 == 0] 

También puede utilizar the filter function.

evens = filter(lambda x: x % 2 == 0,numbers) 

Si la lista es muy larga, puede ser deseable crear algo para iterar sobre la lista en lugar de crear una copia de la mitad de ella usando ifilter from itertools:

from itertools import ifilter 
evens = ifilter(lambda x: x % 2 == 0,numbers) 

o utilizando un generator expression:

evens = (n for n in numbers if n % 2 == 0) 
+0

OP, esta es una gran respuesta, pero considere que lambda es un poco demasiado avanzado para los primeros días de python :) – Trufa

+0

Ugh, 'ifilter'? Simplemente '(x para x en números si no x% 2)' funciona. – katrielalex

+0

He añadido una expresión de generador, aunque he buscado 'n% 2 == 0' –

0

Sólo por diversión, comprobando si number%2 != 1 también funciona;)

evens=[x for x in evens_and_odds if number%2 != 1 ] 

Tenga en cuenta que usted puede hacer algunas cosas inteligentes para separar iguala y las probabilidades en un bucle:

evens=[] 
odds=[] 
numbers=[ evens, odds ] 
for x in evens_and_odds: 
    numbers[x%2 == 1].append(x) 

print evens 
print odds 

El truco anterior funciona porque las expresiones lógicas (==, >, etc.) que funcionan en los números True (1) y/o False (0).

0

En lugar de generar todos los números de Fibonacci y luego filtrar por pares, ¿por qué no generar solo los valores pares?

def even_fibs(): 
    a,b = 1,2 
    while True: 
     yield b 
     a,b = a+2*b, 2*a+3*b 

genera [2, 8, 34, 144, 610, 2584, 10946 ...]

entonces su código de suma se convierte en:

total = 0 
for f in even_fibs(): 
    if f >= 4000000: 
     break 
    else: 
     total += f 

o

from itertools import takewhile 
total = sum(takewhile(lambda n: n<4000000, even_fibs())) 
0

Solo verifique esto

A = [i for i in range(101)] 
B = [x for x in A if x%2 == 0] 
print B 
-1
a = range(0,1000) 
b = [] 
for c in a: 
    if c%2==0: 
     b.append(c) 
print b 
+0

Sería bueno que incluyeras alguna información sobre lo que hace. Además, puedes guardar una gran cantidad de código usando el tercer argumento 'step' en' range'. – jonrsharpe

0

usted puede hacer esto utilizando la función de filtro de la siguiente manera:

F = [1, 2] 
while F[-1] < 4000000: 
    F.append(F[-1] + F[-2]) 
print(F) 
print('\n') 
#create the variable that could store the sorted values from the list you have created. 
sorted_number=list(filter(lambda x:x%2==0,F)) 
print(sorted_number) 
Cuestiones relacionadas