2017-10-13 6 views
2

Je rencontre souvent un problème où j'essaye de faire une liste de listes d'une certaine longueur d'une chaîne.Compréhension de liste d'imbrication

Voici un exemple où j'ai une chaîne, mais je voudrais faire une liste de listes de longueur 3:

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) 

Sortie:

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

Alors, cela fonctionne, mais se sent si maladroit.

Existe-t-il un meilleur moyen de combiner ces arguments en une ligne ou pensez-vous que cela rendrait le code illisible?

Répondre

2

Si vous voulez le faire en une seule ligne, vous pouvez simplement créer les listes à l'intérieur de votre compréhension:

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

Ce qu'il fait en une ligne:

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

Cela suppose que la longueur de la La liste est 'target_length ** 2', ce qui est dans cet exemple, mais seulement par coïncidence. –

+1

True. La réponse d'AK47 est la meilleure – triphook

+0

Vous pouvez corriger ou au moins l'améliorer en utilisant 'range (len (x) // target_length)' dans la boucle externe, alors cela fonctionne au moins pour les longueurs de 'x' qui sont un multiple de la longueur cible. –