2010-11-12 17 views
5

Wie erstelle ich eine Liste und extrahiere oder suche nur die geraden Zahlen in dieser Liste?Gerade Zahlen eine Liste?

Erstellen Sie eine Funktion even_only(l), die eine Liste von Ganzzahlen als einziges Argument verwendet. Die Funktion gibt eine neue Liste zurück, die alle (und nur) die Elemente von l enthält, die durch 2 teilbar sind. Die ursprüngliche Liste l soll unverändert bleiben.

Beispiele, even_only([1, 3, 6, 10, 15, 21, 28]) sollte [6, 10, 28] zurückkehren und even_only([1, 4, 9, 16, 25]) sollte [4, 16] zurückzukehren.

Tipp: Beginnen Sie mit dem Erstellen einer leeren Liste. Wenn Sie eine gerade Zahl sehen, fügen Sie sie zu Ihrer Liste hinzu und geben Sie am Ende Ihre Liste zurück.

+2

Das einzige, was ich mir vorstellen kann, ist die Verwendung einer for-Schleife in der Funktion, wo der Bereich des Eingangs getestet wird, um zu sehen, ob es gleichmäßig durch 2 teilbar ist. –

+0

Sie sollten nachschlagen, modulare Aufteilung wird Ihnen eine Tonne helfen. Auch die "Erstelle eine leere Liste" ist machbar, aber du kannst auch auf Filter schauen. –

+1

@justin: Das ist völlig in Ordnung. Wenn Sie genauere Hilfe benötigen, schreiben Sie Code und zeigen Sie uns, was nicht funktioniert. –

Antwort

10

"von Hand":

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

Da es sich um Hausaufgaben handelt, können Sie die is_even Funktion ausfüllen.

+0

es fehlt eine Rückkehr gleicht im ersten Beispiel –

+0

Was für ein dummer Fehler. Danke, dass du das eingefangen hast, Xavier. –

+0

Danke für den Algorithmus, ich habe es von Hand herausgefunden =) –

7

Einfachste Möglichkeit wäre, das zu tun, was Sie in einem Kommentar gepostet haben - durchlaufen Sie die Eingabeliste, um durch 2 teilbare Ziffern zu finden, und fügen Sie sie der Rückgabeliste hinzu.

Die Funktion list.append(x) hilft Ihnen, ein Element zu einer Liste hinzuzufügen.

auch wie bereits erwähnt, sehen die modulo Operation, um festzustellen, ob eine Zahl durch 2 teilbar ist ...

+0

Gibt es eine Idee, wie man den Bereich einer Liste verwendet, wenn sie nur ganze Zahlen akzeptiert? –

2

Der beste Weg, dies zu tun (als Anfänger) ist wahrscheinlich eine Verständnisliste. Da dies eine Hausaufgabe ist, werde ich es nicht für Sie, aber hier ist die Syntax:

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

Sie müssen nur mit (Ihr Zustand) ersetzen, was gut paßt (im Grunde genau das, was Sie beschrieben).

P.S. Ich weiß, dass einige Leute sagen, dass Verständnislisten für Anfänger etwas fortgeschritten sind, aber ich denke, es ist kein Konzept, das zu schwer zu fassen und extrem nützlich ist.

+0

eine 'for' -Schleife zu kennen wäre für ihn viel hilfreicher, da eine for-Schleife in fast jeder Programmiersprache existiert, was nicht der Fall ist Verständnis. –

+0

Ich muss mich wundern - glaubst du wirklich, dass jemand in CS101, der nicht weiß, wie er selbst von Ungereimtem unterscheidet, in die Nähe von Listenkompromittierungen kommen sollte? Es gibt jemandem eine Dynamitstange, die noch nicht über den Zweck eines Dochts verfügt. –

+0

Natürlich muss er wissen, was eine for-Schleife ist, das heißt nicht, dass er Verständnislisten überspringen muss. Sie sind nicht schwer zu verstehen, sie sind extrem verbreitet in Python-Code, etc. Und weil es nicht in jeder Programmiersprache existiert, bedeutet es nicht, dass es zuletzt gelernt werden sollte. –

2

Verwenden Sie die filter Funktion dies in einer funktionalen Weise zu tun:

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

Edit: aktualisiert mit der richtigen Parität von Null pro Vincents Kommentar.

+2

Soweit ich weiß, 0 ist sogar (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

schließen, aber es druckt nur die ursprüngliche Liste. –

+0

Was nur die ursprüngliche Liste druckt? – Falmarri

+0

das ist die beste Antwort – 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 ... String-Konvertierung in einer anonymen Funktion, die negative Indizien überprüft .... als Hausaufgabe zu beantworten. So hätte * plagerism nicht überall geschrieben! ': D + 1' – Droogans

1

ich dieses Problem vor kurzem hatte und verwendet:

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 

returns [2,4,6]

-1

All = (1, 3, 6, 10, 15, 21, 28] Von iertools Import takewhile Evenonly = einholen (Lambda x: x% 2 == 0, Alle) Drucken (Liste (Evenonly)

Verwandte Themen