web-dev-qa-db-fra.com

liste de compréhension remplacer pour boucle dans matrice 2D

J'essaie d'utiliser la compréhension de liste pour remplacer la boucle for.

le fichier d'origine est

2 3 4 5 6 3
1 2 2 4 5 5
1 2 2 2 2 4

for loop

line_number = 0
for line in file:
    line_data = line.split()
    Cordi[line_number, :5] = line_data 
    line_number += 1

la sortie est

[[2 3 4 5 6 3]
 [1 2 2 4 5 5]
 [1 2 2 2 2 4]]

si j'utilise la compréhension de liste à la place, pour ce que je peux penser, c'est (je dois changer le type de données en int, afin qu'il puisse être tracé dans la partie ultérieure du programme)

Cordi1= [int(x) for x in line.split() for line in data]

mais la sortie est

[1, 1, 1]

mais line.split() for line in data est en fait une liste, et si j'essaye

Cordi1 = [int(x) for x in name of the list]

ça marche, pourquoi ça arrive?

18
rankthefirst

Vous avez échangé l'ordre de vos boucles; ils doivent être ordonnés de la même manière qu'ils seraient imbriqués, de gauche à droite:

[int(x) for line in data for x in line.split()]

Cela boucle d'abord sur data, puis pour chaque line itération, itère sur line.split() pour produire x. Vous produisez ensuite une flat liste d'entiers à partir de ceux-ci.

Cependant, puisque vous essayez de construire une liste de listes, vous devez imbriquer une compréhension de liste dans une autre:

Cordi1 = [[int(i) for i in line.split()] for line in data]

Démo:

>>> data = '''\
... 2 3 4 5 6 3
... 1 2 2 4 5 5
... 1 2 2 2 2 4
... '''.splitlines()
>>> [int(x) for line in data for x in line.split()]
[2, 3, 4, 5, 6, 3, 1, 2, 2, 4, 5, 5, 1, 2, 2, 2, 2, 4]
>>> [[int(i) for i in line.split()] for line in data]
[[2, 3, 4, 5, 6, 3], [1, 2, 2, 4, 5, 5], [1, 2, 2, 2, 2, 4]]

Si vous vouliez un tableau numpy multidimensionnel à partir de cela, vous pouvez soit convertir ce qui précède directement en tableau ou créer un tableau à partir des données, puis remodeler:

>>> import numpy as np
>>> np.array([[int(i) for i in line.split()] for line in data])
array([[2, 3, 4, 5, 6, 3],
       [1, 2, 2, 4, 5, 5],
       [1, 2, 2, 2, 2, 4]])
>>> np.array([int(i) for line in data for i in line.split()]).reshape((3, 6))
array([[2, 3, 4, 5, 6, 3],
       [1, 2, 2, 4, 5, 5],
       [1, 2, 2, 2, 2, 4]])
37
Martijn Pieters