Преобразование строки в целое число с ошибкой float

#python #list #csv

#python #Список #csv

Вопрос:

Я пытаюсь импортировать CSV на Python 3, затем добавить его и переместить, чтобы затем я мог использовать его для выполнения некоторых вычислений.

 import csv
data=[]
file=input ("Enter file name: ")
with open(file,"r") as f:
    reader=csv.reader(f)
    for row in reader:
        data.append(row) #creating list of lists
print (data)

print("Calculate COV")
lst = [val for subl in data for val in subl] #converting to list
float(lst) #error
print (lst)

def list_var(lst):
    var = 0
    avg = sum(lst)/len(lst)
    for i in lst:
        var  = (avg - i)**2
    return
SD=list_var(lst)
print (SD)
  

Это то, что я получаю:

  TypeError: float() argument must be a string or a number
  

Комментарии:

1. как lst выглядит ваш?

2. Зачем вам преобразовывать строку в целое число с помощью float ? Вы имеете в виду «преобразование строки в float с помощью float » , не так ли?

3. Это список без добавления: [[‘13.25’, ‘12.97’, ‘13.12’, ‘13.47’, ‘13.44’, ‘13.09’, ‘12.86’, ‘12.78’, ‘12.91’, ‘12.93’, ‘12.91’, ‘13.11’], [‘12.92’, ‘13.42’, ‘13.58’, ‘13.7’, ‘13.62’, ‘13.7’, ‘13.31’, ‘12.86’, ‘12.59’, ‘12.81’, ‘13.46’, ‘12.9’], [‘13.39’, ‘13.5’, ‘13.29’, ‘13.26’, ‘13.38’, ‘13.45’, ‘13.46’, ‘11.95’, «, ‘12.57’, ‘13.22’, ‘12.88’], [‘12.48’, ‘13.76’, ‘13.7’, ‘13.77’, ‘13.08’, ‘13.48’, ‘13.25’, ‘12.31’, ‘12.56’, ‘12.56’, ‘12.95’, ‘13.38’], [‘12.52’, ‘14.07’, ‘14.46’, ‘14.13’, ‘13.98’, ‘14.07’, ‘13.92’, ‘12.7’, ‘13.01’, ‘12.79’, ’13’, ‘13.13’]]

4. Я пытаюсь преобразовать строку в целые числа, чтобы я мог использовать их в функциях

5. @Tetra опять же, я думаю, вы имеете в виду «с плавающей точкой» — целые числа — это другой тип чисел — смотрите Руководство .

Ответ №1:

вы пытаетесь преобразовать list to float . попробуйте

 lst = [float(val) for subl in data for val in subl if val.strip()]    
  

я думаю, что ваше понимание списка должно выглядеть следующим образом

 lst= [[float(val) for val in subl if val.strip()] for subl in data ]
  

если ваш список выглядит так, как показано ниже, и вы дополняете список, попробуйте приведенный ниже код

 lst=[['13.25', '12.97', '13.12', '13.47', '13.44', '13.09', '12.86', '12.78', '12.91', '12.93', '12.91', '13.11'],
     ['12.92', '13.42', '13.58', '13.7', '13.62', '13.7', '13.31', '12.86', '12.59', '12.81', '13.46', '12.9'],
     ['13.39', '13.5', '13.29', '13.26', '13.38', '13.45', '13.46', '11.95', '', '12.57', '13.22', '12.88'], 
     ['12.48', '13.76', '13.7', '13.77', '13.08', '13.48', '13.25', '12.31', '12.56', '12.56', '12.95', '13.38'], 
     ['12.52', '14.07', '14.46', '14.13', '13.98', '14.07', '13.92', '12.7', '13.01', '12.79', '13', '13.13']]
  

затем попробуйте

 from itertools import chain
newlst=[ float(val) for val in chain.from_iterable(lst) if val.strip()]
  

этот метод не является хорошей практикой кодирования, но помогает

 newlst=[]
for val in chain.from_iterable(lst):#
    if val.strip():
        try:
            newlst.append(float(val))
        except ValueError:
            # here you print the val . 
            #and check what type of val is coming here and perform logic 
            #so that you can convert these type also into float
            for i in val.split(';'):
                newlst.append(float(i if i.strip() else 0))

            pass
  

отключить itertools

 for subl in data:
    for val in subl:
        if val.strip():
            try:
                newlst.append(float(val))
            except ValueError:
                # here you print the val . 
                #and check what type of val is coming here and perform logic 
                #so that you can convert these type also into float
                for i in val.split(';'):
                    newlst.append(float(i if i.strip() else 0))

                pass
  

Комментарии:

1. Возможно ли это без использования itertools?

2. @Tetra вам не нужен блок try / except для очистки вашего вывода, когда вы получаете данные из файла.

3. @PadraicCunningham Во-первых, как мне очистить данные? Во-вторых, теперь я получаю ошибку в первой функции: Трассировка (последний последний вызов): File «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 22, в <module> SD=list_var(результаты) Файл «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 18, в list_var среднее значение = sum(результаты)/len(результаты) Ошибка значения: недопустимый литерал для int() с базой 10: ‘1;2;3;4;5’

4. @Tetra добавьте, как выглядит строка на ваш вопрос

5. @Padraic Cunningham строка отображается символом «[]» перед добавлением

Ответ №2:

 flattened = [float(x) for y in data for x in y if x]
print flattened
[13.25, 12.97, 13.12, 13.47, 13.44, 13.09, 12.86, 12.78, 12.91, 12.93, 12.91, 13.11, 12.92, 13.42, 13.58, 13.7, 13.62, 13.7, 13.31, 12.86, 12.59, 12.81, 13.46, 12.9, 13.39, 13.5, 13.29, 13.26, 13.38, 13.45, 13.46, 11.95, 12.57, 13.22, 12.88, 12.48, 13.76, 13.7, 13.77, 13.08, 13.48, 13.25, 12.31, 12.56, 12.56, 12.95, 13.38, 12.52, 14.07, 14.46, 14.13, 13.98, 14.07, 13.92, 12.7, 13.01, 12.79, 13.0, 13.13]
  

Если вы хотите очистить свой вывод, сделайте это перед добавлением к данным.

 with open(file,"r") as f:
    reader=csv.reader(f)
    for row in reader:
        data.append(row)
  

Поместите print row в свой цикл, чтобы точно увидеть, как выглядят ваши данные, затем удалите все, что вам нужно, чтобы сделать его допустимым для приведения в виде float.

Где бы ваши данные ни выглядели :

 lst= [['1;2;3;4;5'], ['65;5;64;65;2'], ['215;5;85;65;54']]

spl= [x.split(";") for y in lst for x in y]
flattened = [float(x) for y in spl for x in y if x]
print flattened
[1.0, 2.0, 3.0, 4.0, 5.0, 65.0, 5.0, 64.0, 65.0, 2.0, 215.0, 5.0, 85.0, 65.0, 54.0]
  

Комментарии:

1. Вы имеете в виду «для y в данных для x»?

2. @Tetra, да, какой бы ваш список списков вы ни опубликовали, он у вас есть "" там, поэтому using if x не будет пытаться преобразовать его в значение с плавающей точкой.

3. Я все еще получаю: «ValueError: не удалось преобразовать строку в float: »

4. соответствует ли ваш список тому, что вы опубликовали в комментариях, и в чем именно ошибка?

5. Нет, сейчас я использую простой: трассировка (последний последний вызов): Файл «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 11, в файле <module> lst = [float(x) для y в data для x в y, если x] «C:UsersMarcDesktopPythonMetal Lossother.py «, строка 11, в <listcomp> lst = [float(x) для y в data для x в y, если x] Ошибка значения: не удалось преобразовать строку в float: ‘1;2;3;4;5’