Aus Elementen einer Liste Unterlisten machen

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
Malinka
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:53

Hallo,

ich habe mal wieder ein kleines Problem. Wahrscheinlich sehe ich den Wald gerade vor lauter Bäumen nicht mehr, aber ich komme einfach nicht weiter.

Ich habe zum Beispiel eine Liste:

Code: Alles auswählen

list = [a, b, c, d, e, f]
Ich möchte nun jedem Element in der Liste ein weiteres Element hinzufügen, so dass es so ausschaut:

Code: Alles auswählen

list = [[a,1], [b,1], [c,1], [d,1], [e,2], [f,2]]
Ich möchte also hinterher Listen in der Liste haben.
Ich muss ja irgendwie über den Index der Liste gehen, weiß aber nicht wie. Ich habe es schon mit list.append[index] versucht, aber Python möchte das nicht ;-)


Ich wäre euch dankbar für einen kleiner Anstupser in die richtige Richtung. :-)
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Hallo,

ich weiß jetzt nicht, was sich hinter `a`, `b` etc. verbirgt. Jedenfalls würde ich es so machen:

Code: Alles auswählen

>>> flat_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> nested_list = [[item] for item in flat_list]
mutetella

Edit: Und wenn Du den Index mit angefügt haben möchtest, dann halt so:

Code: Alles auswählen

>>> flat_list = ['a', 'b', 'c', 'd', 'e', 'f']
>>> nested_list = [[item, index] for index, item in enumerate(flat_list)]
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Malinka
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:53

Okay, danke, das habe ich tatsächlich verstanden.

Wie kann ich jetzt vorgeben, bis zu welchem Index der flat_list ich welches zweite Element hinzufüge?
Also zu "a" bis "d" wird die "1" hinzugefügt und ab "e" kommt "2" z.B.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Je nachdem. Gibt es eine Regel nachdem du die Zahl inkrementierst? Also etwa alle vier Elemente? Oder ist das doch komplexer?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht gibt es irgendeinen coolen Ansatz mittels `itertools`, aber hier erstmal die "naive" Variante:

Code: Alles auswählen

def get_numerated(items, group_size):
    result = []
    n = 1
    for i in range(0, len(items), group_size):
        result.extend([n, item] for item in items[i : i + group_size])
        n += 1
    return result

Code: Alles auswählen

>>> get_numerated(['a', 'b', 'c', 'd', 'e', 'f'], 4)
[[1, 'a'], [1, 'b'], [1, 'c'], [1, 'd'], [2, 'e'], [2, 'f']]
Aber verrate uns doch bitte mal, was dein eigentliches Vorhaben ist...
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Malinka hat geschrieben:Wie kann ich jetzt vorgeben, bis zu welchem Index der flat_list ich welches zweite Element hinzufüge?
Das hängt von der jeweiligen Bedingung, die für das zweite Element erfüllt sein muss, ab.

In einem einfachen Fall kann man z. B. sowas machen:

Code: Alles auswählen

>>> nested_list = [[item, (item not in ('a', 'b', 'c', 'd'))+1] for item in flat_list]
Das deckt jetzt aber nur ``von 'a' bis 'd' eine 1, alle anderen eine 2`` ab.

Vielleicht solltest Du einmal erklären, um was es geht... :wink:

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Malinka
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:53

Leonidas hat geschrieben:Je nachdem. Gibt es eine Regel nachdem du die Zahl inkrementierst? Also etwa alle vier Elemente? Oder ist das doch komplexer?
Nein, eher komplexer. Ich habe gerade die Zahlen nicht im Kopf, aber es ist in etwa bei Index 24, Index 50, Index 72 und Index 88. Also bis Index 24 die 1, bis 50 die 2, bis 72 die 3 und bis 88 die 4. So ungefähr.
Malinka
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:53

snafu hat geschrieben:Aber verrate uns doch bitte mal, was dein eigentliches Vorhaben ist...


Also:
Ich habe eine Datei mit Text. Ich muss nun im Text eine Markierung angeben, zu welchem Satz ein Wort gehört. Etwa so

Code: Alles auswählen

liste = [["Hallo","1"], ["wie","1"], ["geht","1"], ["es","1"], ["euch","1"], ["?","1"], ["Ich","2"], ["habe","2"], ["eine","2"], ["Frage","2"], [".","2"]]
Die Stellen, an denen die satztrennenden Satzzeichen sind, habe ich als Indizes.
Benutzeravatar
snafu
User
Beiträge: 6732
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sicher, dass du anstatt der Nummierung über den Index nicht lieber gegen auftretende Satzzeichen prüfen willst?

Dazu beispielhaft ein Auszug aus meiner Python-Session:

Code: Alles auswählen

>>> tokens = ['Hallo', 'wie', 'geht', 'es', 'euch', '?', 'Ich', 'habe', 'eine', 'Frage', '.']
>>> result = []
>>> n = 1
>>> for tok in tokens:
...     result.append((n, tok))
...     if tok in ('?', '.'):
...         n += 1
... 
>>> print result
[(1, 'Hallo'), (1, 'wie'), (1, 'geht'), (1, 'es'), (1, 'euch'), (1, '?'), (2, 'Ich'), (2, 'habe'), (2, 'eine'), (2, 'Frage'), (2, '.')]
Malinka
User
Beiträge: 18
Registriert: Donnerstag 29. August 2013, 15:53

snafu hat geschrieben:Sicher, dass du anstatt der Nummierung über den Index nicht lieber gegen auftretende Satzzeichen prüfen willst?

Naja, so wie du es gemacht hast, ist es natürlich besser. Da spare ich mir einiges an Rödelei :-)
Ich schau mal, wie ich damit klarkomme.

Vielen Dank erstmal!
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

"Zu welchem Satz ein Wort gehört" würde imho aber eher zu einem Mapping "Wort → {Satz Indizes}" passen. (Gegeben ein Wort → Suche Satz (Sätze))

Das könnte ich mir so vorstellen:

Code: Alles auswählen

from collections import defaultdict

words_to_phrases = defaultdict(set)

tokens = ['Hallo', 'wie', 'geht', 'es', 'euch', '?', 'Ich', 'habe', 'eine', 'Frage', 'an', 'euch', '.']

index = 1
for token_ in tokens:
    if token_ in ('.?'):
        index += 1
    else:
        words_to_phrases[token_].add(index)

> defaultdict(<type 'set'>, {'Hallo': set([1]), 'wie': set([1]), 'Ich': set([2]), 'euch': set([1, 2]), 'Frage': set([2]), 'an': set([2]), 'eine': set([2]), 'geht': set([1]), 'habe': set([2]), 'es': set([1])})

words_to_phrases["euch"]
> set([1, 2])
Wie man sieht habe ich das Beispiel mal um ein "euch" im zweiten Satz erweitert. Damit wird klar, dass Wörter in mehreren Sätzen vorkommen können. Über das Dictionary kann ich einfach auf das Wort zugreifen und auslesen, in welchen Sätzen es vorkommt.

Da ich die Satzzeichen auslassen wollte, habe ich die Logik im Schleifenrumpf umgedreht.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten