Проблема питона с отрицательными десятичными знаками - PullRequest
0 голосов
/ 11 августа 2011

У меня есть список отрицательных чисел. Я хочу сделать гистограмму с ними. Насколько я знаю, Python не может выполнять операции с отрицательными числами. Это правильно? Список подобен [-0.2923998, -1.2394875, -0.23086493 и т. Д.]. Я пытаюсь найти максимальное и минимальное число, чтобы определить диапазон. Мой код выдаёт ошибку:

setrange = float(maxv) - float(minv)
TypeError: float() argument must be a string or a number

А это код:

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    lineval = line.split()
    print lineval
    val.append(lineval)
print val
#val = map(float,val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

Все значения, которые заносятся в список 'val', являются отрицательными десятичными знаками. Что означает ошибка и как ее исправить?

Входной файл выглядит так:

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259

Ответы [ 2 ]

5 голосов
/ 11 августа 2011

Результаты split() представляют собой список значений разделения, и, вероятно, именно поэтому вы получаете эту ошибку.

Например, если вы сделаете '-0.2'.split(), вы получите список с однимзначение ['-0.2'].

РЕДАКТИРОВАТЬ: Ага!С вашим входным файлом, похоже, это проблема: -0.733029194040.765257900121.Я думаю, что вы хотите сделать эти два отдельных числа с плавающей точкой?

Предполагая, что исправленный файл выглядит так:

-0.0783532095182 -0.99415440702 -0.692972552716 -0.639273674023 -0.733029194040 -0.765257900121 -0.755438339963
-0.144140594077 -1.06533353638 -0.366278118372 -0.746931508538 -1.02549039392 -0.296715961215
-0.0915937502791 -1.68680560936 -0.955147543358
-0.0488457137771 -0.0943080192383 -0.747534412969 -1.00491121699
-1.43973471463
-0.0642611118901 -0.0910684525497
-1.19327387414 -0.0794696449245
-1.00791366035 -0.0509749096549
-1.08046507281 -0.957339914505 -0.861495748259

Следующий код больше не будет генерировать это исключение:

f = open('clusters_scores.out','r')
#first, extract all of the sim values
val = []
for line in f:
    linevals = line.split()
    print linevals
    val += linevals
print val
val = map(float, val)
maxv = max(val)
minv = min(val)
setrange = float(maxv) - float(minv)

Я изменил его, чтобы взять результат списка из split () и объединить его со списком, а не добавить его, что сработает, если в вашем файле есть допустимые входные данные.

1 голос
/ 11 августа 2011

Все значения, которые заносятся в список 'val', являются отрицательными десятичными знаками.

Нет, это не так; это списки строк, которые представляют отрицательные десятичные дроби, поскольку вызов .split() создает список. maxv и minv - это списки строк, которые не могут быть переданы на float().

Что означает ошибка и как ее исправить?

Это относится к тому факту, что содержание val не то, о чем вы думаете. Первым шагом в отладке является проверка ваших предположений. Если вы попробуете этот код в REPL, то сможете проверить содержимое maxv и minv и заметить, что у вас есть списки строк, а не ожидаемые строки.

Полагаю, вы хотите объединить все списки строк (из каждой строки файла) в один список строк. Используйте val.extend(lineval) вместо val.append(lineval).

Тем не менее, вы все равно захотите map строк в float перед вызовом max или min, потому что в противном случае вы будете сравнивать строки как строки, а не как float. (Это может хорошо работать, но явное лучше, чем неявное.)

Еще проще, просто прочитайте весь файл сразу и разбейте его; .split() без аргументов разделяется на пробел, и новая строка - пробел. Вы также можете выполнить пинг map в той же точке, что и чтение, с осторожным применением понимания списка. Я бы написал:

with open('clusters_scores.out') as f:
  val = [float(x) for x in f.read().split()]
result = max(val) - min(val)
...