2017-12-16 29 views
0

ich eine Liste teilen will, die etwa wie folgt aussieht:Python Split-Liste in Unterlisten basierend auf dem ersten Elemente in den Unterlisten

list = [5, a, b, c, d, e, 2, a, b, 4, a ,b ,c ,d , ...] 

in dieser:

list = [ [5, a, b, c, d, e], [2, a, b] , [4, a ,b ,c ,d] ...] 

Die ersten Elemente/Anzahl ist variabel, also kein Muster, um es in gleichmäßige Stücke zu teilen. Die Chunks-Größe oder -Länge sollte auf dem ersten Element des Chunks basieren. Auch die alphabetischen Buchstaben sind nur Platzhalter, um das Beispiel lesbarer zu machen, in Wirklichkeit sind die alphabetischen Buchstaben Floats und Zahlen.

Die große Liste sieht wirklich so etwas wie dieses:

list = [5, 7, 3.2, 3.1, 4.6, 3, 2, 5.1, 7.1, 4, 5.12 ,3.4 ,4.8 ,12.1 , ...] 
+1

Sehr schön !! Was hast du probiert? –

+0

Ich habe * nicht * downvoted, aber http://idownvotedbecau.se/noattempt/ –

+1

Da Sie keinen Versuch unternommen haben, hier ist eine Lösung mit Pandas für Sie. 'x = pd.Series (1.); result = x.groupby (x.type (str) .str.isdigit(). cumsum()). apply (Liste) .tolist() 'Viel Glück! –

Antwort

5

einfache Weise jede Blocklänge gelesen n und schließen die nächsten n Werte ein:

it = iter(l) 
[[n, *islice(it, n)] for n in it] 

Python 2-Version:

it = iter(l) 
[[n] + list(islice(it, n)) for n in it] 

oder ohne islice:

it = iter(l) 
[[n] + [next(it) for _ in range(n)] for n in it] 

Demo:

>>> from itertools import islice 
>>> l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k'] 
>>> it = iter(l) 
>>> [[n, *islice(it, n)] for n in it] 
[[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']] 
+1

Danke! Das war die richtige Antwort. Ich kämpfte mit For-Loops, aber sie waren zu peinlich, um in der Frage zu posten. –

2

Sie können versuchen, diese:

l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'a', 'b', 4, 'a' ,'b' ,'c' ,'d'] 

pos = [(index, i) for index, i in enumerate(l) if type(i)==int] 
l = [l[p[0]:p[0]+p[1]+1] for p in pos] 
print(l) 

Ausgang:

[[5, 'a', 'b', 'c', 'd', 'e'], [2, 'a', 'b'], [4, 'a', 'b', 'c', 'd']] 
+1

Die letzte Liste enthält * nicht * das letzte Element. Aber bitte, füttere Trolle nicht ... –

+0

Funktioniert nicht, wenn es unter den "Platzhaltern" Ints gibt. Wie es in ihrem expliziten Beispiel gibt. –

0

könnte auch etwas Einfaches wie diese versuchen:

l = [5, 'a', 'b', 'c', 'd', 'e', 2, 'f', 'g', 4, 'h' ,'i' ,'j' ,'k'] 

numbers = [i for i, e in enumerate(l) if isinstance(e, int)] 

result = [l[s:e] for s, e in zip(numbers[:-1], numbers[1:])] + [l[numbers[-1]:]] 

print(result) 
# [[5, 'a', 'b', 'c', 'd', 'e'], [2, 'f', 'g'], [4, 'h', 'i', 'j', 'k']] 
Verwandte Themen