2012-06-27 13 views
7

Fondamentalmente ho bisogno di aiuto nella generazione di numeri pari da un elenco che ho creato in Python:Generazione di un elenco di numeri anche in Python

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

Ho provato un paio di metodi diversi, ma ogni volta che si stampa, ci sono numeri dispari mescolati con gli altri!

So come generare numeri pari/dispari se dovessi fare un intervallo di 0-100, tuttavia, ottenendo solo i numeri pari dalla lista menzionata in precedenza mi sono bloccato!

P.S. Sto usando Python da un paio di giorni, se questo risulta estremamente semplice, grazie in anticipo!

EDIT: Grazie per tutte le risposte, con il tuo aiuto ho superato questo piccolo problema. Ecco quello che ho finito per completare con un po 'di esercitazione che chiede di sommare i numeri pari della sequenza di Fibonacci:

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

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

includere solo il numero nella lista di destinazione se è divisibile per 2. –

+4

Quali sono stati i diversi metodi che si è tentato? – geoffspear

+3

Un po 'strano sei riuscito a generare una sequenza di Fibonacci prima di poter filtrare un elenco ...;) –

risposta

4

Il seguente esempio dovrebbe risolvere il problema.

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

Questo è se vuoi stampare tutti i numeri pari - se vuoi ottenere una lista con cui puoi lavorare, vedi le risposte qui sotto. Edit: Vedo che la nuova versione lo aggiunge ad un nuovo elenco :) –

1

scorrere l'elenco e utilizzare l'operatore modulo per controllare anche

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

nah, le comprensioni delle liste sono decisamente migliori per questo genere di cose –

+0

d'accordo ... Non le ho mai viste prima. Sembrano veloci ed efficienti! – javajavajava

14

utilizzare una lista di comprensione (vedi: Searching a list of objects in Python)

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

Questo è un bene perché lascia lista intatto e puoi lavorare con evensList come un normale elenco di oggetti.

Spero che questo aiuti!

+1

Questo è il più pulito. Mi hai battuto, hai un upvote. –

+0

Penso che la comprensione delle liste potrebbe essere un po 'troppo avanzata per i primi giorni con Python ... ma questa è solo la mia opinione! – Trufa

+0

@Trufa list comprehensions è una delle parti migliori di Python ... perché non presentarle in anticipo? –

3

Nel tuo caso specifico, my_list[1::3] funzionerà. Ci sono sempre due numeri interi dispari tra interi anche in Fibonacci: pari, dispari, dispari, pari, dispari, strano .....

>>> 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

Questo caso funziona, ma poiché si sta facendo affidamento su slicing e stepping per indice, non è una soluzione portatile. – jathanism

+0

Vedo che stai tagliando l'elenco, ma ci sono due punti? Come si chiama questo metodo? –

+1

@Erty - Il terzo numero è il "passo". Si inizia dal primo elemento e poi si prende ogni terzo elemento dopo. – mgilson

0

È possibile utilizzare list comprehension per generare una nuova lista che contiene solo i anche i membri dalla tua lista originale.

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

poi:

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

cede

[2, 8, 34, 144] 

Oppure, in alternativa utilizzare un generatore di espressione, se non avete bisogno di tutti i numeri in una sola volta:

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

I valori t gallina sarebbe availabe come necessario, ad esempio se è stato utilizzato un ciclo for:

esempio,

for val in new_data: 
    print val 

Il vantaggio del generatore di espressione è che l'intero elenco non è generato e conservato nella memoria contemporaneamente, ma i valori vengono generati quando ne hai bisogno, il che rende meno richiesta in memoria.Ci sono altre importanti differenze che potresti voler leggere a un certo punto se sei interessato.

2

Si può fare questo con a list comprehension:

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

È anche possibile utilizzare the filter function.

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

Se la lista è molto lunga, può essere desiderabile per creare qualcosa per scorrere l'elenco, piuttosto che creare una copia di metà di esso utilizzando ifilter from itertools:

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

o utilizzando un generator expression:

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

OP, questa è un'ottima risposta, ma considera che lambda è un po 'troppo avanzato per i primi giorni di python :) – Trufa

+0

Ugh, 'ifilter'? Giusto '(x per x nei numeri se non x% 2)' funziona. – katrielalex

+0

Ho aggiunto un'espressione generatore, anche se sono andato per 'n% 2 == 0' –

0

Solo per divertimento, verificare se funziona anche number%2 != 1;)

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

noti che si possono fare alcune cose intelligenti per separare le livella e le probabilità in un loop:

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

print evens 
print odds 

È possibile che questo trucco funziona perché espressioni logiche (==, >, etc.) che operano su numeri True (1) e/o False (0).

0

Invece di generare tutti i numeri di Fibonacci e quindi il filtraggio degli altri, perché non generare solo i valori pari?

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 ...]

allora il vostro codice di somma diventa:

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

Basta controllare questo

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

Sarebbe bello se includessi alcune informazioni su ciò che fa. Inoltre, potresti risparmiare un sacco di codice usando il terzo argomento 'step' su' range'. – jonrsharpe

0

si potrebbe fare questo usando la funzione di filtro come segue:

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) 
Problemi correlati