2012-06-27 72 views
7

Grundsätzlich brauche ich Hilfe bei der Erzeugung von geraden Zahlen aus einer Liste, die ich in Python erstellt haben:Erstellen einer Liste von geraden Zahlen 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, ...] 

Ich habe versucht ein paar verschiedene Methoden, aber jedes Mal, wenn ich drucken, da sind ungerade Zahlen mit den Zahlen gemischt!

Ich weiß, wie man gerade/ungerade Zahlen erzeugt, wenn ich einen Bereich von 0-100 machen würde, aber nur die geraden Zahlen von der vorher erwähnten Liste zu bekommen, hat mich ratlos gemacht!

P.S. Ich benutze Python erst seit ein paar Tagen, wenn es sich als extrem einfach herausstellt, danke im Voraus!

EDIT: Vielen Dank für alle Antworten, mit Ihrer Hilfe habe ich dieses kleine Problem durchgemacht. Hier ist, was ich am Ende mit ein wenig Übung zu vervollständigen fragen die geraden Zahlen der Fibonacci-Sequenz zusammenzufassen:

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

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

Nur die Nummer in der Zielliste enthalten, wenn es von 2. –

+4

Was sind die verschiedenen Methoden waren, die Sie versuchten, teilbar ist? – geoffspear

+3

Etwas merkwürdig, dass Sie es geschafft haben, eine Fibonacci-Sequenz zu generieren, bevor Sie eine Liste filtern können ...;) –

Antwort

4

Das folgende Beispiel Ihr Problem lösen sollte.

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

Dies ist, wenn Sie alle geraden Zahlen drucken möchten - wenn Sie eine Liste erhalten möchten, mit der Sie arbeiten können die Antworten unten. Edit: Ich sehe die neue Version hängt es an eine neue Liste :) –

1

Iterierte durch die Liste und verwenden Sie den Modulo-Operator auch

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

nah, Liste Comprehensions sind viel besser für diese Art von Sache –

+0

vereinbart ... Ich habe sie noch nie zuvor gesehen. Sie sehen schnell und effizient aus! – javajavajava

14

Verwenden Sie eine Liste Verständnis zu überprüfen (siehe: Searching a list of objects in Python)

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

Das ist gut, weil es die Liste verlässt intakt und Sie können mit evensList als normales Listenobjekt arbeiten.

Hoffe, das hilft!

+1

Dies ist das sauberste. Du schlägst mich dazu, hast eine Aufwertung. –

+0

Ich denke, das Verständnis der Liste könnte ein wenig zu fortgeschritten für die ersten Tage mit Python sein ... aber das ist nur meine Meinung! – Trufa

+0

@Trufa list comprehensions ist einer der besten Teile über Python ... warum nicht früh vorstellen? –

3

In Ihrem speziellen Fall my_list[1::3] wird funktionieren. Es gibt immer zwei ungeraden Zahlen zwischen geraden Zahlen in Fibonacci: gerade, ungerade, ungerade, gerade, ungerade, ungerade .....

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

Dieser Fall funktioniert, aber weil Sie auf schneiden und schrittweise durch Index verlassen, ist es keine portable Lösung. – jathanism

+0

Ich sehe, Sie schneiden die Liste, aber es gibt zwei Doppelpunkte? Wie heißt diese Methode? –

+1

@Eerty - Die dritte Zahl ist der "Schritt". Du beginnst beim ersten Element und nimmst danach jedes dritte Element. – mgilson

0

Sie list comprehension verwenden können, um eine neue Liste zu erstellen, die nur die geraden Elemente enthält von deiner ursprünglichen Liste.

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

dann:

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

ergibt

[2, 8, 34, 144] 

Oder alternativ einen Generator Ausdruck verwenden, wenn Sie nicht auf einmal alle Zahlen müssen:

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

Die Werte t Henne würde je nach Bedarf availabe wird, zum Beispiel, wenn Sie eine for-Schleife:

zB

for val in new_data: 
    print val 

Der Vorteil des Generators Ausdrucks, dass die gesamte Liste im Speicher auf einmal nicht erzeugt und gespeichert werden, Die Werte werden jedoch so generiert, wie Sie sie benötigen, wodurch der Speicher weniger beansprucht wird.Es gibt noch andere wichtige Unterschiede, die Sie vielleicht später noch einmal lesen sollten, wenn Sie interessiert sind.

2

Sie können dies mit a list comprehension:

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

Sie auch the filter function verwenden können.

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

Wenn die Liste sehr lang ist, kann es wünschenswert sein, etwas zu schaffen, über die Liste zu durchlaufen, anstatt eine Kopie Hälfte davon erstellen ifilter from itertools mit:

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

oder durch ein generator expression mit:

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

OP, das ist eine gute Antwort, aber bedenken Sie, dass Lambda für die ersten Tage von Python etwas zu weit fortgeschritten ist :) – Trufa

+0

Ugh, 'ifilter'? Nur '(x für x in Zahlen, wenn nicht x% 2)' funktioniert. – katrielalex

+0

Habe einen Generatorausdruck hinzugefügt, obwohl ich für 'n% 2 == 0' ging –

0

Just for fun, zu überprüfen, ob number%2 != 1 auch funktioniert;)

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

Beachten Sie, dass einige kluge Dinge tun können, in einer Schleife Evens und Quoten zu trennen:

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

print evens 
print odds 

arbeitet die oben Trick, weil logische Ausdrücke (==, >, etc.) auf die Zahlen True Betrieb (1) und/oder False (0).

0

Anstatt alle Fibonacci-Zahlen zu erzeugen und dann nach even zu filtern, warum erzeugen Sie nicht nur die geraden Werte?

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

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

dann Summencode wird:

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

oder

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

Überprüfen Sie einfach diese

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

Es wäre schön, wenn Sie einige Informationen bezüglich dessen, was dies tut, enthalten. Außerdem könnten Sie eine Menge Code speichern, indem Sie das dritte 'step'-Argument in' range' verwenden. – jonrsharpe

0

Sie können dies tun, um die Filterfunktion wie folgt:

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) 
Verwandte Themen