Ersetzen von ausgewählten Elementen in einer Liste in Python
Habe ich eine Liste: mylist = [0, 0, 0, 0, 0]
Ich möchte nur das ersetzt den ausgewählten Elementen, sagen wir die erste, zweite und vierte durch eine gemeinsame Nummer A = 100
.
Einen Weg, dies zu tun:
mylist[:2] = [A]*2
mylist[3] = A
mylist
[100, 100, 0, 100, 0]
Ich bin auf der Suche nach einem one-liner, oder eine einfachere Methode, dies zu tun. Eine mehr Allgemeine und flexible Antwort vorzuziehen ist.
- Wie wäre es damit? mylist[:2],mylist[3] = [A]*2,
InformationsquelleAutor elwc | 2013-01-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zumal Sie ersetzen einen beträchtlichen Teil der
list
, ich würde dies tun immutably:Absichtlich in Python, das die Herstellung einer neuen
list
ist ein one-liner, während mutierend einelist
erfordert eine explizite Schleife. In der Regel, wenn Sie nicht wissen, welche Sie wollen, Sie wollen die neuelist
. (In einigen Fällen ist es langsamer oder komplizierter, oder hast du noch ein paar andere Codes, die eine Referenz auf die gleichelist
und sehen muss, es mutiert, oder was auch immer, das ist der Grund, warum das "meistens" statt "immer".)Wenn Sie dies tun wollen, mehr als einmal, ich würde es einpacken in Funktion, wie die Volatilität suggeriert:
Ich persönlich würde wahrscheinlich machen es zu einem generator, so dass es liefert eine iteration statt zurückgeben einer Liste, auch wenn ich nie gehen zu müssen, einfach, weil ich dumm bin, dass Art und Weise. Aber wenn Sie tatsächlich tun es brauchen:
Oder:
valarray::gslice
valarray
macht Sinn, in C++numpy
Sinn macht, in Python—undnumpy
's erweiterte slicing ist sogar noch einfacher alsgslice
für fast alle Fälle. Zum Beispiel, sehen Sie mgilson Antwort auf diese Frage. (Natürlich "fast jeden" und "fast alle" sind nicht ganz dasselbe wie "jeder" und "alle"... aber es ist selten, dass ich mich schriftlich einigenumpy
code und fehlt ein C++ - feature...)Es ist definitiv eine allgemeinere Lösung, kein one-liner, obwohl. Zum Beispiel, in Ihrem Fall, würden Sie rufen:
Numpy unterstützt diese, wenn Sie nicht gegen die Verwendung eines
np.ndarray
:np.ndarray
hier?"Ist es das, was du suchst? Machen Sie eine Liste der Indizes, die Sie ändern möchten, und dann eine Schleife durch diese Liste, um die Werte zu ändern.
Ich, wie eine list comprehension:
Kein großer fan von diesem, aber Sie könnten versuchen, diese (obwohl ich denke, dass alle der oben genannten sind viel mehr prägnant und einfach zu Lesen):
Abgesehen von der fragwürdigen Lesbarkeit und müssen für einen import, @abarnert wies darauf hin ein paar weitere Probleme, nämlich, dass
map
noch schafft eine unnötige Liste (die ist verworfen, mit der_
aber trotzdem erstellt) und, dass es nicht funktionieren in Python 3, damap
gibt einen iterator in Python 3.x. Sie können die sechs Modul für die Simulation des Verhaltens vonmap
in Python 3.x von Python 2.x, und in Kombination mitcollections.deque
(wieder-so der Vorschlag von @abarnert), erzielen Sie dieselbe Leistung ohne die Schaffung der zusätzlichen Liste im Speicher, da eindeque
enthalten können maximal0
Elemente verwerfen alles, was es erhält von dermap
iterator (beachten Sie, dass mitsix
,map
wird simuliert durch die Verwendung vonitertools.imap
).Wieder, es gibt absolut keine müssen dies jemals verwendet - jede Lösung oben/unten ist besser 🙂
list(map(…))
. Oder Sie können beide lösen mithilfesix.map
und übergeben das Ergebnis an eineiter_discard
- Funktion, die Sie implementieren können, alscollections.deque(it, max_size=0)
. Das ist alles eine ganze Menge mehr Gedanken, als sollten Sie jemals in eine Lösung, die Sie waren nicht ein großer fan von in den ersten Platz, natürlich...map
zu einemiter_discard
- Funktion). Ich werde in einem update für die Nachwelt Willen, und Dank wie immer für die hilfreichen Infos 🙂iter_discard
waren Teil der 3.x standard-Bibliothek. Das argument gegen Sie war, würde dies wollen die Menschen motivieren, mitmap
für Nebenwirkungen statt der Ergebnisse (und, wenn Sie es wirklich wollen, diedeque
trick wurde Hinzugefügt, um die Dokumentation füritertools
irgendwo). Kann ich die kaufen... aber für diese Art von Fragen, die Leute wollen immer, dass sowieso (und dann wollentimeit
die Ergebnisse mit jeder version von Python Sie finden kann).consume
Rezept. Das ist interessant - ich habe immer gefühlt, wie ich etwas Tat, was nicht ganz Recht ist, wenn mitmap
für die Nebenwirkungen, die Sie erwähnen (die unnötige Liste Nebenprodukt als der stärkste Indikator). Dassdeque
Technik lindert definitiv das Gefühl, also danke für den neuen Stich hinzufügen, um die Drehung 🙂