Accueil » Python » Forums Python » Forum général Python » Ajouter deux listes de listes

 • Ajouter deux listes de listes

Document Actions
Réponses: 12   Visites: 0
Up one level
Vous devez être un membre enregistré pour contribuer sur ce forum. Inscrivez-vous maintenant

 • Ajouter deux listes de listes

Posté par NooZ le 08/06/2008 18:21
Bonjours à tous, j'ai une question sur l'ajout de "liste de liste".
Pour faire simple, j'ai plusieurs objets qui contiennent des listes de ce genre :
code:
((objet1, objet2, objet3), (objet1', objet2'), (objet1", objet2", objet3"))


A chaque instant, je parcours certains de ces objets pour réunir leurs liste et la retourner à une fonction d'affichage, je veut donc obtenir ceci :
code:
((objet1, objet2, objet3, objetx, objety), (objet1', objet2', objetx'), (objet1", objet2", objet3", objetz, objeta))


Pour le moment, je parcours tout les objets à prendre en compte, et copie leurs liste avec une boucle,
code:
for objet in objets:
   for i in range(20):
      list.extend(objet.list)

Cette méthode prends 7x plus de temps que l'ajout de listes simple, y a t'il un moyen dans le langage/plus rapide pour faire la même chose ?
Merci d'avance.

(J'ai mis des parenthèses à la place des crochets car l'éditeur ne les affiches pas, et dois les prendre pour des balises, même dans un "code" )

 • Re: Ajouter deux listes de listes

Posté par NooZ le 08/06/2008 18:34
>.< mes crochets on encore disparus et on ne peut éditer !
C'est bien sur un :
code:
list(i).extend(objet.list(i))
avec des crochets...

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 08/06/2008 21:44
Je propose

code:
class C:
    def __init__(self,L):
        self.l = L

i = 1
L =[]
for j in xrange(0,10):
    l = range(i,i+4)
    o = C(l)
    L.append(o)

LL =
print LL


voici la trace d'exécution
code:
[[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4]]

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 08/06/2008 21:47
Je redonne le code car l'éditeur a bouffé l'avant dernière ligne

code:
class C:
    def __init__(self,L):
        self.l = L

i = 1
L =[]
for j in xrange(0,10):
    l = range(i,i+4)
    o = C(l)
    L.append(o)

LL =[o.l for o in L ]
print LL

 • Re: Ajouter deux listes de listes

Posté par NooZ le 09/06/2008 21:36
J'ai du mal m'expliquer, ou mal comprendre/tester le code :)
je ne veut pas simplement concaténer plusieurs liste, je veut concaténer des listes de listes en conservant l'ordre.

objet1.liste = ( (a, b, c), (1, 2, 3), (", é, #) )
objet2.liste = ( (t, r, g), (4, 5, 6), (&, à, @) )

{Passage à la moulinette}

liste_finale = ( (a, b, c, t, r, g), (1, 2, 3, 4, 5, 6), (", é, #, &, à, @) )

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 09/06/2008 22:37
Ok, je propose donc :
code:
L1 =[['a', 'b', 'c'],[1, 2, 3],['e','d','#'] ]
L2 =[['t','r', 'g'],[4, 5, 6],['&', 'D', '@'] ] 
L =[code]
for l1,l2 in zip(L1,L2):
    l = list(l1) # deep copy, pour ne pas modifier L1
    l.extend(l2)
    L.append(l)

print L
[/code]
trace d'execution
[code]
[['a', 'b', 'c', 't', 'r', 'g'],[1, 2, 3, 4, 5, 6],['e', 'd', '#', '&', 'D', '@']]
[/code]
Je n'ai pas trouvé comment le faire en une ligne mais en creusant on peut peut-être trouver une solution.

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 09/06/2008 22:38
schnaps ! encore cet éditeur de m.., bon je redonne le code :

code:
L1 =[['a', 'b', 'c'],[1, 2, 3],['e','d','#'] ]
L2 =[['t','r', 'g'],[4, 5, 6],['&', 'D', '@'] ] 
L =[]
for l1,l2 in zip(L1,L2):
    l = list(l1) # deep copy
    l.extend(l2)
    L.append(l)

print L

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 09/06/2008 22:44
Ah ! voilà pour les one-liners :
code:
L =[l1+l2 for l1,l2 in zip(L1,L2)]

 • Re: Ajouter deux listes de listes

Posté par NooZ le 10/06/2008 21:04
Génial, ça correspond exactement à ce que je voudrais, je ne connaissais pas zip :)
Une petite dernière question, il y a moyen de rendre le code "dynamique".
Durant l'exécution, le nombre de liste ( "L1", "L2" ) va varier.
Je dois lui prévoir une bonne centaine de liste, qui serons vide ou non (un peu cracra comme méthode)
ou il y a un moyen pour passer un nombre d'argument différent, dynamiquement ?
Merci beaucoup :)

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 10/06/2008 22:53
Bien sûre, toujours en une ligne :).

Supposes que toutes tes listes sont stockées dans une liste globale G au fur et à mesure que tu les créé.

code:
L1 =[['a', 'b', 'c'],[1, 2, 3],['e','d','#'] ]
L2 =[['t','r', 'g'],[4, 5, 6],['&', 'D', '@'] ] 
L3 =[['f', 'f', '1'],["v", "v", "v"],['a',2973,'12983'] ] 
G =[] #Liste globale
G.append(L1)
G.append(L2)
G.append(L3)
B = reduce(lambda X1,X2:[l1+l2 for l1,l2 in zip(X1,X2)],G)
print B


Voici le résultat :

code:
[['a', 'b', 'c', 't', 'r', 'g', 'f', 'f', '1'], 
[1, 2, 3, 4, 5, 6, 'v', 'v', 'v'], 
['e', 'd', '#', '&', 'D', '@', 'a', 2973, '12983']]

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 10/06/2008 22:54
Ah j'ai pas testé pour les listes vides...

 • Re: Ajouter deux listes de listes

Posté par ychaouche le 10/06/2008 22:55
Malheureusement dès qu'il y a une liste vide ça ne marche plus, qu'elle soit insérée au début à la fin ou au milieu.

 • Re: Ajouter deux listes de listes

Posté par NooZ le 12/06/2008 11:58
Génial, j'initialise mes listes pour chaque objet donc ce code devrait passer sans modif ;)
Merci beaucoup !