Seite 1 von 1
Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 16:02
von Malinka
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:
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.

Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 16:32
von mutetella
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)]
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 16:44
von Malinka
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.
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 17:30
von Leonidas
Je nachdem. Gibt es eine Regel nachdem du die Zahl inkrementierst? Also etwa alle vier Elemente? Oder ist das doch komplexer?
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 17:30
von snafu
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...
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 17:31
von mutetella
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...
mutetella
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 17:36
von Malinka
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.
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 17:44
von Malinka
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.
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 18:00
von snafu
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, '.')]
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 18:08
von Malinka
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!
Re: Aus Elementen einer Liste Unterlisten machen
Verfasst: Montag 9. Dezember 2013, 19:07
von Hyperion
"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.