2013-06-12 2 views
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 как список поплавков. Как я могу исправить вышеуказанную программу? Любая помощь, пожалуйста.

+0

@Nolen yes, но data2 = map (float, data2) приведен

+0

Это похоже на файл tsv - вы рассмотрели использование [CSV-модуля] (http://docs.python.org/3.3 /library/csv.html) и изменение разделителя на вкладки? Вам нужно будет открыть файл только один раз, чтобы получить доступ ко всем столбцам. – thegrinner

ответ

3

Там нет необходимости читать файл 3 раза здесь, вы можете сделать это, определив простую функцию, которая возвращает float значение элемента, если оно является допустимым числом, в противном случае возвращает его как есть.

Теперь прочитайте все строки один за другим, используя понимание списка и примените эту функцию к элементам каждой строки. Так что теперь у Вас есть список списков, и это время, чтобы распаковать этот список списков с помощью 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) 

Update: Закрепление ваше решение

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. 
+0

+1 - Мне нравится эта идиома! – dawg

+0

есть разница между (15,5, 18,9, 17,4, 11,4, 23,4) и [15,5, 18,9, 17,4, 11,4, 23,4]? –

+0

@monica yes Первый - это кортеж, а второй - список. Используйте: 'data1, data2, data3 = [list (x) для x в zip (* lis)]', если вы хотите списки. –

0

Используйте функцию float(). Требуется 1 arg, который будет строкой/var, которую вы хотите превратить в float.

0

Используйте float() команду:

with open('data.txt', 'r') as f: 
    col2 = [float(line.split()[1]) for line in f] 
    data2 = col2[1:] 
    print(data2) 
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.)

+0

@ron.rothmanno, Traceback (последний последний звонок): Файл «C: /Users/ed/Desktop/tt.py», строка 5, в для строки в f [1:]: ТипError: '_io.TextIOWrapper' объект не подлежит подписке –

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) 
+0

['A', 'B', 'C', 'D', 'E'] Traceback (последний последний звонок): Файл «C: /Users/ed/Desktop/tt.py ", строка 7, в data2 = float (col2 [1:]) Аргумент типаError: float() должен быть строкой или числом –

Смежные вопросы