2017-09-19 6 views
-5

J'ai deux listes imbriquées en python, par exemple:moyen efficace de rabouter deux listes de listes en python

lst1 = [ 
     [ [1,2],[3,4] ], [ [5,6,7],[8,9,10] ] 
     ] 
lst2 = [ 
     [ [11,12],[13,14] ], [ [15,16,17],[18,19,20] ] 
     ] 

Je voudrais être en mesure de mettre dans un index correspondant à la version aplatie les listes, et retourner la liste "croisée":

par exemple l'indice est de 5, la sortie est la nouvelle liste

lst3 = [ 
     [ [1,2],[3,4] ], [ [5,16,17],[18,19,20] ] 
     ] 

Je peux le faire en faisant une triple boucle imbriquée mais je sais qu'il doit y avoir un moyen plus rapide en python, en utilisant probablement le iterator?

EDIT: Je demande comment plus efficacement procédez comme suit:

lst1 = [ 
     [ [1,2],[3,4] ], [ [5,6,7],[8,9,10] ] 
     ] 
lst2 = [ 
     [ [11,12],[13,14] ], [ [15,16,17],[18,19,20] ] 
     ] 


lst3 = [] 

counter = 0 
for i in xrange(len(lst1)): 
    for j in xrange(len(lst1[i])): 
     temp1 = [] 
     for k in xrange(len(lst1[i][j])): 
      temp2 = [] 
      counter += 1 
      if counter > 5: 
       temp2.append(lst2[i][j][k]) 
      else: 
       temp2.append(lst1[i][j][k]) 
      temp1.append(temp2) 
     lst3.append(temp1) 

print lst1 
print lst2 
print lst3 

lst3 Résultat:

[[[1], [2]], [[3], [4]], [[5], [16], [17]], [[18], [19], [20]]] 
+0

Vous allez devoir expliquer comment cette entrée correspond à cette sortie. – user2357112

+0

Parcourez [le didacticiel] (https://docs.python.org/3/tutorial/index.html#the-python-tutorial) pour vous faire une idée des outils à votre disposition. Peut-être commencer par écrire sur papier, dans votre langue * naturelle *, les étapes nécessaires pour accomplir la tâche. Essayez de transformer cela en pseudo-code et enfin en code réel. Si vous êtes coincé avec le code réel, revenez et demandez. S'il vous plaît lire [demander] et [mcve]. – wwii

Répondre

1

Je ne suis pas sûr de ce que vous entendez par « permutés » liste, mais il semble que vous essayez de faire une sorte de regex de la liste. Mais vous mentionnez également que vous voulez une liste aplatie, même si votre sortie n'est pas aplatie. Donc, je ne suis pas vraiment sûr de ce que vous demandez. Mais si j'utilise uniquement le titre comme un moyen de deviner ce que vous cherchez, alors la réponse est assez simple, en utilisant list comprehension:

>>> lst3 = [x for x in [lst1, lst2]] 

Cela donnera le résultat suivant:

>>> lst3 
[[[[1, 2], [3, 4]], [[5, 6, 7], [8, 9, 10]]], [[[11, 12], [13, 14]], [[15, 16, 17], [18, 19, 20]]]] 

qui est une combinaison des deux listes. Je ne sais pas si c'est une "combinaison" comme vous le voulez, car cela peut être interprété de plusieurs façons et je ne peux pas dire exactement ce que vous voulez.

+0

La compréhension de la liste est superflue; '[[lst1, lst2]' produit déjà la même liste. – user2357112

+0

vrai. C'est superflu. Je l'avais soumis de cette manière parce qu'il semblait que l'OP voulait faire quelque chose de plus, comme filtrer une des listes. C'est plus facile une fois déjà dans une compréhension de liste. –