2017-10-13 3 views
2

Ich laufe häufig auf ein Problem, wo ich versuche, eine Liste von Listen einer bestimmten Länge aus einer Zeichenfolge zu erstellen.Nesting List Comprehension

Dies ist ein Beispiel, wo ich einen String habe, möchte aber eine Liste von Listen der Länge 3 machen:

x = '123456789' 

target_length = 3 

new = [i for i in x] 
final = [new[i:i+target_length] for i in range(0, len(x), target_length)] 

print(final) 

Ausgang:

[['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']] 

Also, das funktioniert, fühlt sich aber so klobig.

Gibt es eine bessere Möglichkeit, diese Argumente in einer Zeile zu kombinieren, oder glauben Sie, dass der Code dadurch unlesbar wird?

Antwort

2

Wenn Sie es in einer Zeile tun möchten, können Sie nur die Listen in Ihrem Verständnis erstellen:

x = '123456789' 
target_length = 3 

[list(x[i:i+target_length]) for i in range(0, len(x), target_length)] 
>> [['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9']] 
0

Dies tut es in einer Zeile:

f2 = [[x[(j * target_length) + i] for i in range(target_length)] for j in range(target_length)] 
+0

Dies setzt voraus, dass die Länge der Liste ist 'target_length ** 2', was es in diesem Beispiel ist, aber nur zufällig. –

+1

Wahr. Die Antwort von AK47 ist die bessere – triphook

+0

Sie können es reparieren oder zumindest verbessern, indem Sie 'range (len (x) // target_length)' in der äußeren Schleife verwenden, dann funktioniert es mindestens für Längen von 'x', die ein Vielfaches von sind die Ziellänge. –

Verwandte Themen