Seite 1 von 1
Element an x-ter Stelle einfügen
Verfasst: Donnerstag 26. November 2009, 12:39
von lucia
Hey
Ich möchte eine Funktion schreiben, die einen Text einliest und wieder ausgibt, dabei aber an jeder x-ten Stelle ein bestimmtes Wort einfügt.
Ich habe den Text eingelesen und an eine Liste übergeben.
Sagen wir, x ist in diesem Fall 5.
Dann kann ich ja mit
auf jedes fünfte Element zugreifen.
append() fügt das Wort am Ende ein,
daher meine Frage, ob es eine andere Methode gibt,
die das Wort direkt nach jedem 5. Element einfügt.
MfG,
lucia
Re: Element an x-ter Stelle einfügen
Verfasst: Donnerstag 26. November 2009, 12:58
von /me
lucia hat geschrieben:daher meine Frage, ob es eine andere Methode gibt,
die das Wort direkt nach jedem 5. Element einfügt.
Aktuell bin ich regexp-verseucht:
Code: Alles auswählen
characters = "abcdefghijklm"
parts = re.findall("\w{1,5}", characters)
print("NEU".join(parts))
Verfasst: Donnerstag 26. November 2009, 13:22
von ms4py
Der Datentyp ist aber offensichtlich eine Liste und kein String.
("AttributeError: 'str' object has no attribute 'append'")
In diesem Fall musst du ``insert`` verwenden, z.B. so:
Code: Alles auswählen
index = 5
while index < len(my_list):
my_list.insert(index, 'neu')
index += 6
Hinweis: Mit jedem "insert" musst du ja einen Schritt weiter, deshalb plus 6 und nicht plus 5.
Verfasst: Donnerstag 26. November 2009, 14:03
von /me
ice2k3 hat geschrieben:Der Datentyp ist aber offensichtlich eine Liste und kein String.
Ich wollte den Schritt mit der Umwandlung in eine Liste sparen.
Verfasst: Donnerstag 26. November 2009, 14:49
von lucia
ice2k3, vielen Dank, das ist genau das, was ich gebraucht habe. Funktioniert einwandfrei.
/me, dir auch vielen Dank

Verfasst: Donnerstag 26. November 2009, 15:57
von ms4py
/me hat geschrieben:ice2k3 hat geschrieben:Der Datentyp ist aber offensichtlich eine Liste und kein String.
Ich wollte den Schritt mit der Umwandlung in eine Liste sparen.
Da er aber immer von Wörtern redet, ist die Liste vermutlich keine Liste mit Zeichen.
Außerdem erzeugst du ja auch eine Liste bei deiner Lösung...

Verfasst: Donnerstag 26. November 2009, 16:07
von /me
ice2k3 hat geschrieben:Da er aber immer von Wörtern redet, ist die Liste vermutlich keine Liste mit Zeichen.
Mmpfff ... stimmt. Schäme ich mich jetzt oder haue ich den Fragesteller virtuell weil er keine ganz eindeutige Fragestellung geliefert hat?

Verfasst: Donnerstag 26. November 2009, 16:17
von EyDu
Ich finde es rückwärts irgendwie einfacher:
Code: Alles auswählen
def insertions(new, data, x=5):
for i in range(len(data) - len(data)%x, 0, -x):
data.insert(i, new)
Edit [@ice2k3s Anmerkung]: Aus dem -5 ein -x gemacht. Aber deshalb den schnell geschriebenen Code vor dem Posten testen? So weit kommt es noch ^^
Verfasst: Donnerstag 26. November 2009, 16:27
von ms4py
Dann aber noch "-x" in "range"

Ansonsten sehr gute Idee!
Verfasst: Freitag 27. November 2009, 19:19
von BlackJack
Mir gefällt die quadratische Laufzeit nicht, und ausserdem mag ich ja funktionale bzw. "streambasierte" Lösungen lieber:
Code: Alles auswählen
def inserter(iterable, item_to_insert, every_nth):
for i, item in enumerate(iterable):
yield item
if not ((i + 1) % every_nth):
yield item_to_insert
Anwendung:
Code: Alles auswählen
In [66]: list(inserter('foobarbaz', '.', 2))
Out[66]: ['f', 'o', '.', 'o', 'b', '.', 'a', 'r', '.', 'b', 'a', '.', 'z']
In [67]: list(inserter('foobarbaz', '.', 3))
Out[67]: ['f', 'o', 'o', '.', 'b', 'a', 'r', '.', 'b', 'a', 'z', '.']
In [68]: list(inserter('foobarbaz', '.', 4))
Out[68]: ['f', 'o', 'o', 'b', '.', 'a', 'r', 'b', 'a', '.', 'z']
Verfasst: Freitag 27. November 2009, 22:20
von ms4py
BlackJack hat geschrieben:Mir gefällt die quadratische Laufzeit nicht,
Gefällt mir allgemein auch nicht mit dem O². Die Frage ist nur, wo du das entdeckt haben sollst in diesen Code-Ausschnitten?!
Verfasst: Freitag 27. November 2009, 23:04
von str1442
Standard Python Listen sind mittels Arrays realisiert, dh Blöcke von PyObject Pointern im Speicher direkt aneinander gereiht. Willst du nun ein Element einfügen, muss jeder Pointer zu einem Objekt im Speicher nach der jeweiligen Position um einen "Platz" verschoben werden (O(n) Laufzeit). Das sorgt zusammen mit der Schleife in im Mittel zu einer quadratischen Laufzeit. Es gibt auch Alternativen zu solchen Arraylisten, zb sogenannte verlinkte Listen. Diese haben dann andere Stärken und Schwächen.