Partage
  • Partager sur Facebook
  • Partager sur Twitter

Remplir une liste 2D à partir d'une liste

    3 février 2011 à 22:03:22

    Bonjour à tous, je suis entrain de programmer un petit programme en python, sauf que je ne trouve pas le bon algo pour faire ce que je veux. J'ai une liste 8x8, qui va devoir contenir les éléments d'une liste de longueur "n".

    Je tente déjà de la remplir en entier, le reste des données de la liste de longueur "n" seront traitées plus tard.

    Voici mon code :

    l=8*[0]
    for i in range(len(l)):	l[i] = 8*[0]			
    for p in range(len(l)):		
    	for k in range(len(l)):
    		l[k][p]=r[0]
    


    Si vous pourriez me mettre sur la bonne voie, ça m'aiderait beaucoup :)

    Cordialement Alex
    • Partager sur Facebook
    • Partager sur Twitter
      3 février 2011 à 22:16:14

      donne un exemple input/output, parce que là c'est pas clair ...
      • Partager sur Facebook
      • Partager sur Twitter

      Python c'est bon, mangez-en. 

        3 février 2011 à 22:26:06

        input :

        r =[1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15,16, ...]

        output :

        l = [[1,2,3, 4,5,6,7,8],
        [9,10,11,12,13,14,15,16],
        .....
        [57,58,59,60,61,62,63,64]
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          4 février 2011 à 1:31:38

          ls_out = [ ls_in[i:i+x]  for i in range(0, len(ls_in), x) ]
          


          Edit: En l'occurence, x = 8. ;)
          • Partager sur Facebook
          • Partager sur Twitter
            4 février 2011 à 4:57:07

            Ou bien:

            ls_out = [ls_in[i:i+x] for i in ls_in[::8]]
            
            • Partager sur Facebook
            • Partager sur Twitter
              4 février 2011 à 7:00:33

              Non. Enfin là peut-être, mais sur un autre exemple ça marchera pas.
              • Partager sur Facebook
              • Partager sur Twitter
                4 février 2011 à 11:26:28

                Désolé, j'ai oublié de remplacer le 8 par x.
                Voilà qui devrait être mieux:

                ls_out = [ls_in[i:i+x] for i in ls_in[::x]]
                
                • Partager sur Facebook
                • Partager sur Twitter
                  4 février 2011 à 11:37:42

                  [[i+j*x+1 for i in range(x)]
                            for j in range(y)]
                  


                  Je suis un accro des comprénsion de liste :-°
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    4 février 2011 à 12:11:01

                    Citation : nyko77

                    ls_out = [ls_in[i:i+x] for i in ls_in[::x]]
                    


                    Ceci ne marchera que si ls_in = list(range(64)) soit [0, 1, 2, ..., 61, 62, 63].
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 février 2011 à 13:11:03

                      Citation : LeYan'tibus

                      Ceci ne marchera que si ls_in = list(range(64)) soit [0, 1, 2, ..., 61, 62, 63]



                      Oui, en effet.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 février 2011 à 23:44:21

                        Finalement j'utilise ceci :

                        l = [ r[i:i+8]  for i in range(0,8) ]
                        


                        Par contre, je rencontre encore un problème dans la suite.
                        Je voudrais effectuer une action à répétion sur cette matrice. Tout en enregistrant la sortie de cette action (contenu dans une matrice 8x8) dans une liste de dimension 1, qui sera ensuite complété par la sortie de l'action des autres blocs 8x8 venant de ma matrice ls_in.

                        for i in range(len(ls_in)/64) :
                        	ls_out = [ ls_in[i:i+8]  for i in range(0,8) ]
                        	#mon action sur la matrice
                        	#enregistrement de la matrice modifié dans une liste 1D
                        	#entrée = [[1,2,3, 4,5,6,7,8],
                        	#[9,10,11,12,13,14,15,16],
                        	#.....
                        	#[57,58,59,60,61,62,63,64]]
                        	#sortie = [1,2,3, 4,5,6,7,8,9,10,11,12,13,14,15,16, ...]
                        	# et ensuite on effectue la même chose sur le second bloc 8x8 , etc
                        



                        En fait, je suis entrain de d'implémenter l'algorithme de Koch et Zhao, pour faire de la stéganographie dans du JPEG (c'est mon action sur la matrice).

                        Cordialement Alex
                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 février 2011 à 10:03:36

                          from itertools import chain
                          
                          x = 5
                          y = 6
                          
                          mat = [[i+j*x+1 for i in range(x)]
                                          for j in range(y)]
                           
                          mat1D = (i for i in chain(*mat))
                          


                          Il y a beaucoup de chose à dire sur ce code :

                          • x et y détermine la longueur et la largeur de la matrice
                          • Tu remarques que j'ai utilisé mon code précédant pour génerer ma matrice (mat)
                          • La fonction chain() du module itertools est un générateur qui prend en paramètre une liste d'objet itérable et itères chacun d'eux dans l'ordre (cf : pratiques avancées et méconnues de python)
                          • Le "*" est une étoile magique ! Cette étoile convertis une liste ou un tuple (par exemple) en une suite d'arguments. :magicien:
                          • Si tu souhaite itérer sur la liste mat1D, utilise plutôt un generator expression comme je l'ai fait. Ce sont des générateurs qui suivent une syntaxe très proche de celle des compréhension de liste : (expression for element in liste if predicat).

                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 février 2011 à 11:18:02

                            C'est moi ou vous utilisez range depuis le début ? À moins qu'il soit en Python3…
                            • Partager sur Facebook
                            • Partager sur Twitter
                              5 février 2011 à 11:21:08

                              Citation : Zopieux

                              C'est moi ou vous utilisez range depuis le début ? À moins qu'il soit en Python3…



                              Je suis habitué à Python 3 :honte:
                              En effet, s'il est sous Python 2, il devrait utiliser xrange()
                              • Partager sur Facebook
                              • Partager sur Twitter
                                5 février 2011 à 12:24:04

                                Merci
                                Je suis bien en Python 2 (installé par défaut sur mon Ubuntu).

                                Par contre, je ne comprend pas où va la matrice en entrée ici :

                                x = 8
                                y = 8
                                mat = [[i+j*x+1 for i in range(x)]
                                for j in range(y)]
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  5 février 2011 à 13:46:44

                                  Recommençons du début. Si j'ai bien compris, tu as en entrée une liste contenant 64 valeurs aléatoires et dans un premier temps tu voudrais reconstruire cette liste en regroupant les valeurs dans des listes de 8 valeurs. Jusqu'ici je crois qu'on as répondu à la question avec :

                                  ls = [ ls_in[i:i+8]  for i in range(0, len(ls_in), 8) ]
                                  
                                  # NOTE:
                                  #     Utilise xrange pour Python 2.x ou range pour Python 3.x.
                                  #     Ici, ls_in vaut une liste de 64 valeurs aléatoire...
                                  


                                  Maintenant tu voudrais faire l'inverse ? Soit :

                                  from itertools import chain
                                  
                                  ls = list(chain(*ls_in))
                                  
                                  # NOTE:
                                  #     Ici, ls_in vaut une liste de 8 listes de 8 valeurs...
                                  


                                  Toujours si j'ai bien suivi, il semble que l'on ai répondu à tes questions (voir, complêtement maché le travail... :-° ).

                                  >>> ls_in = list(range(64)) # <- pour l'exemple ls_in vaut [0, 1, 2 ..., 62, 63]
                                  >>> ls_out = [ ls_in[i:i+8]  for i in range(0, len(ls_in), 8) ]
                                  >>> print(ls_in, ls_out, sep='\n')
                                  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]
                                  [[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30, 31], [32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47], [48, 49, 50, 51, 52, 53, 54, 55], [56, 57, 58, 59, 60, 61, 62, 63]]
                                  >>> ls_in = ls_out # ls_in vaut maintenant une liste de 8 listes de 8 valeurs
                                  >>> from itertools import chain
                                  >>> ls_out = list(chain(*ls_in))
                                  >>> print(ls_in, ls_out, sep='\n')
                                  [[0, 1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14, 15], [16, 17, 18, 19, 20, 21, 22, 23], [24, 25, 26, 27, 28, 29, 30, 31], [32, 33, 34, 35, 36, 37, 38, 39], [40, 41, 42, 43, 44, 45, 46, 47], [48, 49, 50, 51, 52, 53, 54, 55], [56, 57, 58, 59, 60, 61, 62, 63]]
                                  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63]
                                  


                                  Ou j'ai rien compris ? o_O
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    5 février 2011 à 14:21:46

                                    Merci.

                                    Oui voilà, c'est bien ça que je cherche à faire.

                                    Sauf que une des fonctions que je vais appliqué sur la matrice d'entrée, doit obligatoirement recevoir une matrice de taille 8x8 ( j'effectue une DCT). Et après avoir était traité, être sauvegardé dans un liste de dimension 1. Ce que fait exactement :
                                    ls = list(chain(*ls_in))
                                    


                                    Donc, comment puis je traiter la liste d'entrée (de longueur "n") en bloc de 8x8 , et sauvegarder le résultat dans une autre liste, qui sera complété avec les résultats des autres blocs 8x8 ?

                                    Cordialement Alex
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Remplir une liste 2D à partir d'une liste

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown