Ich möchte also eine Liste erstellen, die eine Unterliste einer vorhandenen Liste ist.
Beispielsweise,
L = [1, 2, 3, 4, 5, 6, 7]
Ich möchte eine Unterliste erstellen li
, li
die alle Elemente L
an ungeraden Positionen enthält.
Während ich es schaffen kann
L = [1, 2, 3, 4, 5, 6, 7]
li = []
count = 0
for i in L:
if count % 2 == 1:
li.append(i)
count += 1
Aber ich möchte wissen, ob es einen anderen Weg gibt, dasselbe effizient und in weniger Schritten zu tun.
Antworten:
Lösung
Ja, du kannst:
Und das ist alles. Das Ergebnis enthält die Elemente, die an den folgenden Positionen platziert sind (
0
-basiert, sodass sich das erste Element an der Position befindet0
, das zweite an der Position1
usw.):Das Ergebnis (tatsächliche Zahlen) lautet also:
Erläuterung
Das
[1::2]
am Ende ist nur eine Notation für das Aufteilen von Listen. Normalerweise ist es in der folgenden Form:Wenn wir dies weglassen
start
, wird default (0
) verwendet. Daher würde das erste Element (an Position0
, da die Indizes0
basieren) ausgewählt. In diesem Fall wird das zweite Element ausgewählt.Da das zweite Element weggelassen wird, wird der Standard verwendet (das Ende der Liste). Die Liste wird also vom zweiten Element bis zum Ende wiederholt .
Wir haben auch das dritte Argument (
step
) angegeben2
. Das heißt, ein Element wird ausgewählt, das nächste wird übersprungen und so weiter ...Zusammenfassend
[1::2]
bedeutet dies in diesem Fall :step=2
, also überspringen wir eines, im Gegensatz zustep=1
dem , was standardmäßig ist),EDIT : @PreetKukreti gab einen Link für eine andere Erklärung auf Python Liste Slicing - Notation. Siehe hier: Erklären Sie Pythons Slice-Notation
Extras - Zähler durch ersetzen
enumerate()
In Ihrem Code erstellen und erhöhen Sie den Zähler explizit. In Python ist dies nicht erforderlich, da Sie einige iterable mithilfe von
enumerate()
:Das Obige dient genau dem gleichen Zweck wie der von Ihnen verwendete Code:
Weitere Informationen zum Emulieren von
for
Schleifen mit Zähler in Python: Zugriff auf den Index in Python 'for'-Schleifenquelle
(0,2,4,6)
; es klingt so, als ob OP Indizes will(1,3,5)
, die von gegeben wären[1,2,3,4,5,6,7][1::2]
.1
).list
Slicing. Es unterscheidet sich ein wenig, insbesondere weil daslist
Slice des 's nicht auf die ursprüngliche Liste verweist (in Numarray müssen Sie explizit aufrufen.copy()
, um etwas zu haben, das nicht auf das ursprüngliche Array verweist). Aber es ist schön, etwas zu haben, das für manche Leser besser sein könnte. Würde es Ihnen etwas ausmachen, diesen Link in den Kommentar aufzunehmen, damit ich ihn positiv bewerten kann und er direkt unter der Antwort angezeigt wird?Für die ungeraden Positionen möchten Sie wahrscheinlich:
quelle
Ich mag Listenverständnisse wegen ihrer Math (Set) -Syntax. Wie wäre es damit:
Wenn Sie über eine Liste aufzählen, erhalten Sie grundsätzlich den Index
x
und den Werty
. Was ich hier mache, ist, den Werty
in die Ausgabeliste (gerade oder ungerade) zu setzen und anhand des Indexx
herauszufinden, ob dieser Punkt ungerade ist (x%2 != 0
).quelle
Sie können den bitweisen AND-Operator verwenden
&
. Mal sehen:Der bitweise AND-Operator wird mit 1 verwendet, und der Grund dafür ist, dass eine ungerade Zahl, wenn sie in Binärform geschrieben ist, ihre erste Ziffer als 1 haben muss
Eine UND-Verknüpfung mit 1 gibt nur 1 zurück (1 in Binär hat auch die letzte Ziffer 1), wenn der Wert ungerade ist.
Weitere Informationen finden Sie auf der Seite Python Bitwise Operator .
PS: Sie können diese Methode taktisch verwenden, wenn Sie ungerade und gerade Spalten in einem Datenrahmen auswählen möchten. Angenommen, die x- und y-Koordinaten der Gesichtsschlüsselpunkte werden als Spalten x1, y1, x2 usw. angegeben. Um die x- und y-Koordinaten mit den Breiten- und Höhenwerten jedes Bildes zu normalisieren, können Sie einfach eine Ausführung durchführen
Dies hängt nicht genau mit der Frage zusammen, aber für Datenwissenschaftler und Computer Vision-Ingenieure könnte diese Methode nützlich sein.
Prost!
quelle
list_ = list (range (9)) print (list_ [1 :: 2])
quelle