Liste in Liste

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
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Ich habe folgende Liste:

Code: Alles auswählen

['me', 'me', ['mep', 'di'], 'me']
Wie schaffe ich es, dass der Teil

Code: Alles auswählen

['mep', 'di']
in die äußere Liste aufgenommen wird? So:

Code: Alles auswählen

['me', 'me', 'mep', 'di', 'me']
P.S.: Vielleicht sollte man im Forum einen "Fragen an die Community"-Thread aufmachen, in dem man kleinere Sachen fragen kann.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, bitte lass es bei einem Thread pro Thema. Alles andere macht es nur der Suche und damit anderen mit aehnlichen Problemen schwer.

Das Stichwort fuer dein Problem heisst "flattening".

Hier der Code fuer den Fall, dass du tatsaechlich nur bis zur Tiefe 1 verschachtelt bist und nur Listen verflachen willst:

Code: Alles auswählen

In [4]: a =     ['me', 'me', ['mep', 'di'], 'me']

In [5]: def flatten(xs):
   ...:     flattened = []
   ...:     for x in xs:
   ...:         if isinstance(x, list):
   ...:             flattened.extend(x)
   ...:         else:
   ...:             flattened.append(x)
   ...:     return flattened
   ...: 

In [6]: flatten(a)
Out[6]: ['me', 'me', 'mep', 'di', 'me']
Der Rest bleibt zur Uebung ;)
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Danke für die Antwort! Ich habe gerade gesehen, dass es vielleicht einfacher ist, dass Problem gar nicht erst zu erzeugen:
Ich will dem Element, welches sich in der Mitte der Liste befindet, einen Buchstaben anhängen. Nach diesem Element soll ein weiteres eingefügt werden:

Code: Alles auswählen

liste[len(liste)/2] = [element + "a"]+["di"]
(Die Anzahl der Elemente ist immer ungerade.) Leider entsteht so eine Liste in der Liste.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Wenn ich dich jetzt richtig verstehe:

Code: Alles auswählen

In [7]: a = ['me', 'me', 'mep', 'me']

In [8]: def foo(xs):
   ...:     mid = int(len(xs) / 2)
   ...:     xs[mid] = xs[mid] + "a"
   ...:     xs.insert(mid + 1, "di")
   ...:     return xs
   ...: 

In [9]: foo(a)
Out[9]: ['me', 'me', 'mepa', 'di', 'me']
Aber vielleicht solltest du noch einen Schritt zurueck machen und erzaehlen, was du eigentlich vor hast.
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Vielen Dank! Das hat mein Problem gelöst! :D
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

_nohtyp_ hat geschrieben:Vielen Dank! Das hat mein Problem gelöst! :D
Du solltest noch auf die letzte Bemerkung in cofis letztem Beitrag eingehen. Warum willst du das machen, wie lautet das eigentliche Problem? Dein Ansatz sieht nämlich irgendwie seltsam aus.
Das Leben ist wie ein Tennisball.
_nohtyp_
User
Beiträge: 127
Registriert: Mittwoch 8. Januar 2014, 15:38

Ist eine Aufgabe, die ich selber lösen soll. Trotzdem Danke.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@cofi: Deine Funktion hat ein zweideutiges Interface, entweder sollte sie eine neue Liste zurückgeben, oder die übergebene Liste ändern, aber nicht beides:

Code: Alles auswählen

def modify_me(xs):
    mid = int(len(xs) / 2)
    xs[mid:mid+1] = [xs[mid] + "a", "di"]

def modified(xs):
    mid = int(len(xs) / 2)
    return xs[:mid] + [xs[mid] + "a", "di"] + xs[mid+1:]
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das ist mir danach aufgefallen, hat mich aber nicht genug gestoert. Slicing fuer die Zuweisung zu benutzen ist aber auf jeden Fall eine gute Idee :)

@_nohtyp_: Und darum fragst du nach Loesungen fuer Teilprobleme :roll:
Antworten