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?
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?
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 sortdie endgültige Liste an:
j2 = [i for i in j if i >= 5]
j2.sort()
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
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;)
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.
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
>>> 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 !!
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]
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])
Es geht auch anders,
j3 = j2 > 4; print(j2[j3])
getestet in 3.x.
TypeError: '>' not supported between instances of 'list' and 'int'