Sie sollten sie auf keinen Fall sortieren, bevor Sie sie filtern. Da wird sich das sehr verlangsamen. Beginnen Sie stattdessen mit dem Filtern und sortieren Sie das Ergebnis, wenn Sie es sortiert benötigen
Pietro Speroni
Antworten:
105
Sie können ein Listenverständnis verwenden, um es zu filtern:
j2 = [i for i in j if i >= 5]
Wenn Sie möchten, dass es wie in Ihrem Beispiel sortiert wird, können Sie Folgendes verwenden sorted:
@ İsmail 'cartman' Dönmez: Das liegt wahrscheinlich daran, dass es sich um einen SyntaxError handelt :)
Tim Pietzcker
@Ismail Eigentlich habe ifich gerade den Verstand verloren, als ich diese Antwort schrieb :). Ich bin froh, dass du diesen Kommentar hinterlassen hast, sonst hätte ich es wahrscheinlich nicht bemerkt
Michael Mrozek
Es ist sortedohnehin nicht erforderlich, ein Listenverständnis zu verwenden, wenn Sie es füttern möchten. Hoffentlich kennen Sie Generatorausdrücke und vergessen einfach, wie gut sie in diesem Fall zutreffen;)
1
@ Michael das wäre aber eine schöne Ergänzung! :)
ismail
14
Ein Listenverständnis ist ein einfacher Ansatz:
j2 = [x for x in j if x >= 5]
Alternativ können Sie filterfür genau das gleiche Ergebnis verwenden:
j2 = filter(lambda x: x >= 5, j)
Beachten Sie, dass die ursprüngliche Liste junverändert bleibt.
>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5]) # Michael Mrozek1.4558496298222325>>> timeit(lambda: filter(lambda x: x >= 5, j)) # Justin Ardini0.693048732089828>>> timeit(lambda: filter((5).__le__, j)) # Mine0.714461565831428>>>
Also gewinnt Justin !!
Mit number=1:
>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=1) # Michael Mrozek1.642193421957927e-05>>> timeit(lambda: filter(lambda x: x >= 5, j),number=1) # Justin Ardini3.421236300482633e-06>>> timeit(lambda: filter((5).__le__, j),number=1) # Mine1.8474676011237534e-05>>>
Also gewinnt Michael !!
>>> from timeit import timeit
>>> timeit(lambda: [i for i in j if i >= 5],number=10) # Michael Mrozek4.721306089550126e-05>>> timeit(lambda: filter(lambda x: x >= 5, j),number=10) # Justin Ardini1.0947956184281793e-05>>> timeit(lambda: filter((5).__le__, j),number=10) # Mine1.5053439710754901e-05>>>
Der Code in den Klammern j >= 5erzeugt eine Liste von Trueoder FalseWerten, die dann als Indizes zur Auswahl der gewünschten Werte in dienen j. Schließlich sortieren wir mit der sorteingebauten Funktion numpy.
Antworten:
Sie können ein Listenverständnis verwenden, um es zu filtern:
j2 = [i for i in j if i >= 5]
Wenn Sie möchten, dass es wie in Ihrem Beispiel sortiert wird, können Sie Folgendes verwenden
sorted
:j2 = sorted(i for i in j if i >= 5)
oder rufen Sie
sort
die endgültige Liste an:j2 = [i for i in j if i >= 5] j2.sort()
quelle
if
ich gerade den Verstand verloren, als ich diese Antwort schrieb :). Ich bin froh, dass du diesen Kommentar hinterlassen hast, sonst hätte ich es wahrscheinlich nicht bemerktsorted
ohnehin nicht erforderlich, ein Listenverständnis zu verwenden, wenn Sie es füttern möchten. Hoffentlich kennen Sie Generatorausdrücke und vergessen einfach, wie gut sie in diesem Fall zutreffen;)Ein Listenverständnis ist ein einfacher Ansatz:
j2 = [x for x in j if x >= 5]
Alternativ können Sie
filter
für genau das gleiche Ergebnis verwenden:j2 = filter(lambda x: x >= 5, j)
Beachten Sie, dass die ursprüngliche Liste
j
unverändert bleibt.quelle
Sie können ein Listenverständnis verwenden:
[x for x in j if x >= 5]
quelle
Verwendung
filter
(Kurzversion ohne Funktion mitlambda
, mit__le__
):j2 = filter((5).__le__, j)
Beispiel (Python 3):
>>> j=[4,5,6,7,1,3,7,5] >>> j2 = filter((5).__le__, j) >>> j2 <filter object at 0x000000955D16DC18> >>> list(j2) [5, 6, 7, 7, 5] >>>
Beispiel (Python 2):
>>> j=[4,5,6,7,1,3,7,5] >>> j2 = filter((5).__le__, j) >>> j2 [5, 6, 7, 7, 5] >>>
Verwenden Sie
__le__
ich empfehle dies, es ist sehr einfach,__le__
ist dein FreundWenn Sie es nach gewünschter Ausgabe sortieren möchten (beide Versionen):
>>> j=[4,5,6,7,1,3,7,5] >>> j2 = filter((5).__le__, j) >>> sorted(j2) [5, 5, 6, 7, 7] >>>
Verwenden
sorted
Timings:
>>> from timeit import timeit >>> timeit(lambda: [i for i in j if i >= 5]) # Michael Mrozek 1.4558496298222325 >>> timeit(lambda: filter(lambda x: x >= 5, j)) # Justin Ardini 0.693048732089828 >>> timeit(lambda: filter((5).__le__, j)) # Mine 0.714461565831428 >>>
Also gewinnt Justin !!
Mit
number=1
:>>> from timeit import timeit >>> timeit(lambda: [i for i in j if i >= 5],number=1) # Michael Mrozek 1.642193421957927e-05 >>> timeit(lambda: filter(lambda x: x >= 5, j),number=1) # Justin Ardini 3.421236300482633e-06 >>> timeit(lambda: filter((5).__le__, j),number=1) # Mine 1.8474676011237534e-05 >>>
Also gewinnt Michael !!
>>> from timeit import timeit >>> timeit(lambda: [i for i in j if i >= 5],number=10) # Michael Mrozek 4.721306089550126e-05 >>> timeit(lambda: filter(lambda x: x >= 5, j),number=10) # Justin Ardini 1.0947956184281793e-05 >>> timeit(lambda: filter((5).__le__, j),number=10) # Mine 1.5053439710754901e-05 >>>
Also gewinnt Justin wieder !!
quelle
Da Ihre gewünschte Ausgabe sortiert ist, müssen Sie sie auch sortieren:
>>> j=[4, 5, 6, 7, 1, 3, 7, 5] >>> sorted(x for x in j if x >= 5) [5, 5, 6, 7, 7]
quelle
Wenn Sie erwägen, das
numpy
Modul zu verwenden, ist diese Aufgabe wie gewünscht sehr einfach:import numpy as np j = np.array([4, 5, 6, 7, 1, 3, 7, 5]) j2 = np.sort(j[j >= 5])
Der Code in den Klammern
j >= 5
erzeugt eine Liste vonTrue
oderFalse
Werten, die dann als Indizes zur Auswahl der gewünschten Werte in dienenj
. Schließlich sortieren wir mit dersort
eingebauten Funktionnumpy
.Getestetes Ergebnis (ein
numpy
Array):array([5, 5, 6, 7, 7])
quelle
Es geht auch anders,
j3 = j2 > 4; print(j2[j3])
getestet in 3.x.
quelle
TypeError: '>' not supported between instances of 'list' and 'int'