Element an x-ter Stelle einfügen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
lucia
User
Beiträge: 8
Registriert: Mittwoch 7. Januar 2009, 17:59

Hey :wink:

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

Code: Alles auswählen

for i in list[::5]:
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
Zuletzt geändert von lucia am Donnerstag 26. November 2009, 15:02, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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))
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ice2k3 hat geschrieben:Der Datentyp ist aber offensichtlich eine Liste und kein String.
Ich wollte den Schritt mit der Umwandlung in eine Liste sparen.
Benutzeravatar
lucia
User
Beiträge: 8
Registriert: Mittwoch 7. Januar 2009, 17:59

ice2k3, vielen Dank, das ist genau das, was ich gebraucht habe. Funktioniert einwandfrei. :D

/me, dir auch vielen Dank :wink:
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

/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... ;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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? :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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 ^^
Zuletzt geändert von EyDu am Donnerstag 26. November 2009, 18:30, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Dann aber noch "-x" in "range" ;)
Ansonsten sehr gute Idee!
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']
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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?!
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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.
Antworten