Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Parcourir un tableau en diagonale

0 votes

Je souhaite parcourir un tableau par les diagonales et non par les lignes et les colonnes. Par exemple, le code qui suit utilise les lignes et les colonnes :

for i in range(3):
    for j in range(3):
        print(i, j, sep=",", end=" / ")

Et il donne ceci :

0,0 / 0,1 / 0,2 / 1,0 / 1,1 / 1,2 / 2,0 / 2,1 / 2,2 /

Je voudrais un programme qui donne ceci :

0,0 / 1,0 / 0,1 / 2,0 / 1,1 / 0,2 / 2,1 / 1,2 / 2,2 /

Le parcours se ferait par couche, en testant d'abord les positions proches de 0.

J'ai une grosse quantité de données à parcourir, sur trois dimensions. Voire cinq… Je sais déjà que les solutions intéressantes sont proches de l'origine. J'arrive à le faire pour deux dimensions, mais j'ai du mal pour plus de dimensions. Il faudrait aussi les dimensions puissent être de tailles différentes :

def loopDiag(taille):
    for diag in range(taille+1):
        for i in range(1+diag):
            x, y = diag-i, i
            yield x, y
    for diag2 in range(1,taille+1):
        diag = taille-diag2
        for i in range(1+diag):
            x, y = diag-i, i
            x, y = taille-x, taille-y
            yield x, y

print(list(loopDiag(5)))

[(0, 0), (1, 0), (0, 1), (2, 0), (1, 1), (0, 2),
(3, 0), (2, 1), (1, 2), (0, 3), (4, 0), (3, 1),
(2, 2), (1, 3), (0, 4), (5, 0), (4, 1), (3, 2),
(2, 3), (1, 4), (0, 5), (1, 5), (2, 4), (3, 3),
(4, 2), (5, 1), (2, 5), (3, 4), (4, 3), (5, 2),
(3, 5), (4, 4), (5, 3), (4, 5), (5, 4), (5, 5)]

demandé 7-Aou-2019 par Sbgodin (118 points)

3 Réponses

+2 votes
 
Meilleure réponse

Le code précédent, réécrit ainsi :

l2 = [(i, j) for n in range(n1+n2) for i in range(n+1) for j in range(n2) if i < n1 and j < n2 and (i+j == n)]

où n1 et n2 désignent les nombres de lignes et colonnes resp.
se prête mieux à la généralisation...

répondu 20-Dec-2019 par anonyme
sélectionné 20-Dec-2019 par Sbgodin
+1 vote

Le code suivant :

nbL, nbC = 3, 4 # nb de Lignes et nombre de Colonnes
idx = [(i, k-i) for k in range(nbL+nbC) for i in range(k, -1, -1) if i < nbL and k-i < nbC]

print(idx)

produit la liste d'indices idx :
[(0, 0), (1, 0), (0, 1), (2, 0), (1, 1), (0, 2), (2, 1), (1, 2), (0, 3), (2, 2), (1, 3), (2, 3)]

Dans le cas de la dimension 2 les indices i et k-i sont tels que leur somme vaut k que l'on fait varier de 0 à nbL+nbC. Pour chaque valeur de k, les couples d'indices correspondants sont donc les points (pas tous...) à coordonnées entières de la droite d'équation x+y = k...
Tout cela pour suggérer une piste dans le cas de la dimension 3 où l'on peut envisager de produire les coordonnées entières des points (pas tous...) des plans d'équation x+y+z = k

répondu 25-Nov-2019 par anonyme
0 votes

... en dimension 3, n1, n2 et n3 désignant les nombres d'items pour chaque dimension :

l3 = [(i, j, k) for n in range(n1+n2+n3) for i in range(n+1) for j in range(n2) for k in range(n3) if (i<n1) and (i+j+k == n)].

Avec
n1, n2, n3 = 2, 3, 2
print(l3) # produit l'affichage suivant :

[(0, 0, 0), (0, 0, 1), (0, 1, 0), (1, 0, 0), (0, 1, 1), (0, 2, 0), (1, 0, 1), (1, 1, 0), (0, 2, 1), (1, 1, 1), (1, 2, 0), (1, 2, 1)]

répondu 1-Jan par anonyme
...