Split-Liste in Listen, basierend auf einem Charakter auftreten innerhalb eines Elements
In einer Liste wie der folgenden:
biglist = ['X', '1498393178', '1|Y', '15496686585007',
'-82', '-80', '-80', '3', '3', '2', '|Y', '145292534176372',
'-87', '-85', '-85', '3', '3', '2', '|Y', '11098646289856',
'-91', '-88', '-89', '3', '3', '2', '|Y', '35521515162112',
'-82', '-74', '-79', '3', '3', '2', '|Z',
'0.0', '0.0', '0', '0', '0', '0', '0', '4', '0', '154']
Könnte es einige numerische Elemente Voraus, die ein Charakter. Ich möchte zu brechen, in der sub-Listen wie unten:
smallerlist = [
['X', '1498393', '1'],
['Y', '1549668', '-82', '-80', '-80', '3', '3', '2', ''],
['Y', '1452925', '-87', '-85', '-85', '3', '3', '2', ''],
['Y', '3552151', '-82', '-74', '-79', '3', '3', '2', ''],
['Z', '0.0', '0.0', '0', '0', '0', '0', '0', '4', '0', '154']
]
Wie Sie sagen können, je nach Charakter, die Listen könnte ähnlich Aussehen. Andernfalls könnten Sie haben eine unterschiedliche Anzahl von Elementen oder unterschiedlichen Elementen zusammen. Der Haupt-separator ist die "|"
Charakter. Ich habe versucht, führen Sie den folgenden code zum aufteilen der Liste, aber alles was ich bekomme, ist die gleiche, größere, Liste innerhalb einer Liste. I. e., Liste der len(list) == 1
.
import itertools
delim = '|'
smallerlist = [list(y) for x, y in itertools.groupby(biglist, lambda z: z == delim)
if not x]
Irgendwelche Ideen, wie man es aufteilen erfolgreich?
InformationsquelleAutor omrakhur | 2017-07-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst ein kurzer oneliner, das ist nicht eine optimale Lösung in Bezug auf Platzbedarf, aber es ist kurz und bündig:
Hier verbinden wir alle Elemente der großen Liste durch eine eindeutige, nicht-erscheinen, separator, zum Beispiel
,
, dann geteilt durch|
, und teilen Sie Sie dann wieder jeder Liste in eine Unterliste der ursprünglichen Elemente.Aber wenn Sie auf der Suche nach ein bisschen mehr effiziente Lösung, die Sie tun können, es mit
itertools.groupby
arbeiten auf der mittleren Liste generiert am Fliegen mit derbreakby()
generator, bei dem Elemente ohne|
Trennzeichen zurückgegeben werden, wie es ist, und die mit Trennzeichen aufgeteilt in 3 Elemente: der erste Teil, eine Liste-Trennzeichen (z.B.None
), und der zweite Teil.Wäre es einfacher, zu verbinden die Elemente der Liste zu einem einzigen string, split die Zeichenfolge auf der
'|'
Charakter, dann aufgeteilt und jedem dieser Elemente auf das, was Sie verwendet, um die Liste beizutreten. Wahrscheinlich ein Komma,
Wenn die Liste sehr lang ist, können Sie auch die Iteration über die Elemente in der Liste, die Schaffung eines neuen Teillisten auf, wenn Sie Begegnung ein pipe-Zeichen
|
NameError
fürstart
Brauchen Sie nicht regex oder irgendetwas in der Art - eine einfache Schleife und
str.split()
sollten mehr als genug sein, zumindest wenn man nach einem tatsächlichen effiziente Lösung:Hier ist eine Lösung zu einem ähnlichen problem habe ich nicht, eine Antwort zu. Wie teilt man eine Liste in Teillisten getrennt durch ein Mitglied, z.B. Charakter: