Gibt eine Liste der Elemente in der Liste zurück, die größer als ein Wert sind

75

Ich habe die folgende Liste

j=[4,5,6,7,1,3,7,5]

Was ist der einfachste Weg, um zurückzugeben, [5,5,6,7,7]wenn die Elemente in j größer oder gleich 5 sind?

Carlton
quelle
2
und was wird am schnellsten sein?
Oren
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:

j2 = sorted(i for i in j if i >= 5)

oder rufen Sie sortdie endgültige Liste an:

j2 = [i for i in j if i >= 5]
j2.sort()
Michael Mrozek
quelle
Ich wusste nicht, wo Syntax, schön!
ismail
3
@ İ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.

Justin Ardini
quelle
11

Sie können ein Listenverständnis verwenden:

[x for x in j if x >= 5]
sepp2k
quelle
2

Verwendung filter(Kurzversion ohne Funktion mit lambda, 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 Freund

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

U10-Vorwärts
quelle
Ich denke, Justin hat auch beim zweiten gewonnen. 1,6 * 10 ^ -5 ist größer als 3,4 * 10 ^ -6.
Nazmus Sakib AbIR
1

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]
Lennart Regebro
quelle
1

Wenn Sie erwägen, das numpyModul 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 >= 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.

Getestetes Ergebnis (ein numpyArray):

array([5, 5, 6, 7, 7])
Santiago Ruiz-Valdepeñas
quelle
0

Es geht auch anders,

j3 = j2 > 4; print(j2[j3])

getestet in 3.x.

Harsha VK
quelle
Funktioniert es wirklich Ich habeTypeError: '>' not supported between instances of 'list' and 'int'
Mikhail_Sam