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
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).
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.
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 : (expressionforelementinlisteifpredicat).
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... ).
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
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.
Python c'est bon, mangez-en.