Element einfügen in Python-Liste, nachdem jeder N-te element
Sagen, dass ich eine Python-Liste wie diese:
letters = ['a','b','c','d','e','f','g','h','i','j']
Ich soll das einfügen eines 'x', nachdem jeder N-te element, sagen wir mal drei Zeichen in dieser Liste. Das Ergebnis sollte sein:
letters = ['a','b','c','x','d','e','f','x','g','h','i','x','j']
Ich verstehe, dass ich kann das mit der Schleife und einfügen. Was ich eigentlich Suche, ist eine Pythonish-Weg, einen Einzeiler vielleicht?
InformationsquelleAutor Hasan Iqbal | 2015-06-25
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich zwei Zwischenlagen.
Gegeben:
Verwenden
enumerate
zu bekommen, index, hinzufügen'x'
alle 3rd Brief zB:mod(n, 3) == 2
, dann verketten in string undlist()
es.Aber als @sancho.s Punkte aus das funktioniert nicht, wenn jedes der Elemente, die mehr als einen Brief.
Verschachtelte Verstehens zu glätten, wird eine Liste von Listen(a), in Scheiben geschnitten, in Gruppen von 3 mit
'x'
Hinzugefügt, wenn weniger als 3 vom Ende der Liste.(a)
[item for subgroup in groups for item in subgroup]
flacht ein verzweigtes Liste von Listen.Versuchen, diese
wo
n
ist nach, wie viele Elemente, die Sie einfügen möchten'x'
.Diese arbeiten durch die Initialisierung einer variable
i
und setzen es gleichn
. Dann richten Sie einewhile
- Schleife, die läuft, währendi
ist weniger als die Länge desletters
. Sie dann legen Sie'x'
am indexi
imletters
. Dann müssen Sie hinzufügen, den Wert vonn+1
zui
. Der Grund, den Sie tun müssenn+1
statt nurn
ist, weil, wenn Sie fügen Sie ein element zuletters
es erweitert die Länge der Liste durch eine.Versuchen, diese mit deinem Beispiel, wo
n
ist 3 und Sie einfügen möchten'x'
, würde es so Aussehendem Drucke
was ist das erwartete Ergebnis.
O(n)
innerhalb einerwhile
Schleife macht es quadratisch. Hier ist die wiki zeigt die Zeit-Komplexität der operation.insert
war O(n). Vielen Dank 🙂Obwohl die Verwendung von
list.insert()
imfor
Schleife scheint zu sein, mehr Speicher effizient, um es in einer Zeile, Sie können auch fügen Sie den angegebenen Wert an das Ende eines jeden gleichmäßig verteilt Stücke aufgeteilt, auf jedemnth
index der Liste.itertools.chain
Methode, macht eine iterierbar von[item for subgroup in group for item in subgroup]
das ist immer so schwer zu merken. Auch +1 für die Verwendung von ternary in einer list comprehension; aus irgendeinem Grund hatte ich nicht gedacht, genial!Eine ziemlich einfache Methode:
Können Sie auch die
grouper
Rezept aus dem itertools-Dokumentation für das chunking.new_list.pop()
erscheint ein Wert, der eigentlich da sein?'x'
ich letztes Hinzugefügt.Möchte ich hinzufügen ein neues element pro Element.
Wie über dieses ?
einer ist jetzt
Dies ist ein altes Thema, aber es fehlt die einfachste, die meisten "pythonic" Lösung, imo. Es ist nicht mehr als eine Erweiterung zu Teil 2 Daneben Mikofski's akzeptierte Antwort, dass wohl die Lesbarkeit verbessert wird (und daher macht es mehr pythonic).
Während Daneben Mikofski's Antwort funktioniert, gibt es eine schnellere Lösung durch Zuweisung der Scheiben:
produziert (mit jupyter notebook)