リストの内包表記を使用して for ループを置き換えてみます。
元のファイルは
2 3 4 5 6 3
1 2 2 4 5 5
1 2 2 2 2 4
forループ
line_number = 0
for line in file:
line_data = line.split()
Cordi[line_number, :5] = line_data
line_number += 1
出力は
[[2 3 4 5 6 3]
[1 2 2 4 5 5]
[1 2 2 2 2 4]]
代わりにリスト内包表記を使用する場合、私が考えられるのは(データ型をintに変更して、プログラムの後半でプロットできるようにすることです)
Cordi1= [int(x) for x in line.split() for line in data]
しかし、出力は
[1, 1, 1]
しかし、line.split() for line in data
実際にはリストであり、試してみると
Cordi1 = [int(x) for x in name of the list]
動作しますが、なぜこのようなことが起こるのでしょうか?
ベストアンサー1
ループの順序が入れ替わっています。ループは、ネストされたときと同じ順序、つまり左から右に並べる必要があります。
[int(x) for line in data for x in line.split()]
これは最初にをループしdata
、次に各line
反復でを反復してline.split()
を生成しますx
。次に1つを生成します。フラットこれらからの整数のリスト。
ただし、リストのリストを作成しようとしているため、リストの内包表記を別のリストの内包表記にネストする必要があります。
Cordi1 = [[int(i) for i in line.split()] for line in data]
デモ:
>>> 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]]
これから多次元の numpy 配列が必要な場合は、上記を直接配列に変換するか、データから配列を作成してから形状を変更します。
>>> 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]])