0

次のように、タブで区切られたテキスト ファイル (data.txt) があります。

name    height  weight
A   15.5    55.7
B   18.9    51.6
C   17.4    67.3
D   11.4    34.5
E   23.4    92.1

以下のプログラムは、結果を文字列のリストとして返します。

with open('data.txt', 'r') as f:
    col1 = [line.split()[0] for line in f]
    data1 = col1 [1:]
    print (data1)
with open('data.txt', 'r') as f:
    col2 = [line.split()[1] for line in f]
    data2 = col2 [1:]
    print (data2)
with open('data.txt', 'r') as f: 
    col3 = [line.split()[2] for line in f]
    data3 = col3 [1:]
    print (data3)

結果は次のとおりです。

['A', 'B', 'C', 'D', 'E']
['15.5', '18.9', '17.4', '11.4', '23.4']
['55.7', '51.6', '67.3', '34.5', '92.1']

しかし、data2 と data3 を float のリストとして取得したいと考えています。上記のプログラムを修正するにはどうすればよいですか?助けてください。

4

5 に答える 5

3

ここでファイルを 3 回読み取る必要はありません。有効な数値の場合は項目の float 値を返し、それ以外の場合はそのまま返す単純な関数を定義することでこれを行うことができます。

リスト内包表記を使用してすべての行を 1 つずつ読み取り、この関数を各行の項目に適用します。これでリストのリストができたので、次を使用してそのリストのリストを解凍しzip(*)、戻り値をdata1,data2に割り当てます。data3

def ret_float(x):
    try:
        return float(x)
    except ValueError:
        return x

with open('data.txt') as f:
    next(f) #skip the header
    lis = [ map(ret_float,line.split()) for line in f]
    #[['A', 15.5, 55.7], ['B', 18.9, 51.6], ['C', 17.4, 67.3], ['D', 11.4, 34.5], ['E', 23.4, 92.1]]
    #unzip the list
    data1, data2, data3 = zip(*lis)

    #if you want data1,data2,data3 to be lists then use:
    #data1, data2, data3 = [list(x) for x in  zip(*lis)]
...     
>>> data1
('A', 'B', 'C', 'D', 'E')
>>> data2
(15.5, 18.9, 17.4, 11.4, 23.4)
>>> data3
(55.7, 51.6, 67.3, 34.5, 92.1)

更新: ソリューションの修正

with open('data.txt', 'r') as f:
    col2 = [line.split()[1] for line in f]
    data2 = list(map(float, col2 [1:]))   # apply float to each item using `map`
                                          # as `map` returns a `map` object in py3.x
                                          # you have to pass it to list() 
with open('data.txt', 'r') as f: 
    col3 = [line.split()[2] for line in f]
    data3 = list(map(float, col3 [1:]))
    print (data3)

ヘルプmap: _

>>> print(map.__doc__)
map(func, *iterables) --> map object

Make an iterator that computes the function using arguments from
each of the iterables.  Stops when the shortest iterable is exhausted.
于 2013-06-12T18:45:46.827 に答える
0
with open('data.txt', 'r') as f:
    col1 = [line.split()[0] for line in f]
    data1 = col1 [1:]
    print (data1)
with open('data.txt', 'r') as f:
    col2 = [line.split()[1] for line in f]
    data2 = float(col2 [1:])
    print (data2)
with open('data.txt', 'r') as f: 
    col3 = [line.split()[2] for line in f]
    data3 = float(col3 [1:])
    print (data3)
于 2013-06-12T18:45:38.350 に答える
0

float文字列を読みどおりに変換します。

data1 = col1 [1:]

になる

data1 = float(col1 [1:])

しかし、あなたがこれを尋ねていないことは知っていますが、あなたのアプローチは少し横向きです。次のようなプログラム構造を検討することをお勧めします。

data0 = []
data1 = []
data2 = []
with open('data.txt', 'r') as f:
    f.readline()
    for line in f:
        vals = line.split()
        data0.append(vals[0])
        data1.append(vals[1])
        data2.append(vals[2])
print(data0)
print(data1)
print(data2)

それが役に立てば幸い!

(免責事項: Python 2.7 で動作します。3.x については不明です。)

于 2013-06-12T18:44:47.217 に答える
0

機能を使用してくださいfloat()。これは、フロートに変換したい文字列/変数になります。

于 2013-06-12T18:43:58.973 に答える
0

float()次のコマンドを使用します。

with open('data.txt', 'r') as f:
    col2 = [float(line.split()[1]) for line in f]
    data2 = col2[1:]
    print(data2)
于 2013-06-12T18:44:05.277 に答える