これから作成するにはどうすればよいですか(2列、固定幅):
0.35 23.8
0.39 23.7
0.43 23.6
0.47 23.4
0.49 23.1
0.51 22.8
0.53 22.4
0.55 21.6
2 つのリスト:
list1 = [0.35, 0.39, 0.43, ...]
list2 = [23.8, 23.7, 23.6, ...]
ありがとうございました。
おそらくあなたはこのようなものを探しています
>>> str1 = """0.35 23.8
0.39 23.7
0.43 23.6
0.47 23.4
0.49 23.1
0.51 22.8
0.53 22.4
0.55 21.6"""
>>> zip(*(e.split() for e in str1.splitlines()))
[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')]
上記のソリューションを簡単に拡張して、ファイルを含むあらゆるタイプの反復可能オブジェクトに対応できます。
>>> with open("test1.txt") as fin:
print zip(*(e.split() for e in fin))
[('0.35', '0.39', '0.43', '0.47', '0.49', '0.51', '0.53', '0.55'), ('23.8', '23.7', '23.6', '23.4', '23.1', '22.8', '22.4', '21.6')]
数値をfloatにする場合は、文字列の代わりに、おそらくマップによってfloat関数に渡す必要があります。
>>> zip(*(map(float, e.split()) for e in str1.splitlines()))
[(0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55), (23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6)]
そして最後にそれを2つの別々のリストに解凍します
>>> from itertools import izip
>>> column_tuples = izip(*(map(float, e.split()) for e in str1.splitlines()))
>>> list1, list2 = map(list, column_tuples)
>>> list1
[0.35, 0.39, 0.43, 0.47, 0.49, 0.51, 0.53, 0.55]
>>> list2
[23.8, 23.7, 23.6, 23.4, 23.1, 22.8, 22.4, 21.6]
だからそれがどのように機能するか
zipはイテレータのリストを取得し、各イテレータのペアワイズタプルのリストを返します。itertools.izipも同様ですが、ペアワイズタプルのリストを返す代わりに、ペアワイズタプルのイテレーターを返します。これはよりメモリフレンドリーになります
mapは、イテレータの各要素に関数を適用しました。したがってmap(float, e.split)
、文字列を浮動小数点数に変換します。マップを表す別の方法は、LCまたはジェネレータ式を使用することです。
最後に、 str.splitlinesは、改行で区切られた文字列を個々の行のリストに変換します。
これを試して:
splitted = columns.split()
list1 = splitted[::2] #column 1
list2 = splitted[1::2] #column 2