Python: индексирование плавает?

1

У меня есть два набора данных, которые я читаю через вложенные для циклов в Python. Мне нужно сопоставить строки двух разных текстовых файлов, используя общее число (время). В двух файлах время записывается по-разному (пример 21: 53: 28.339 по сравнению с 121082008.3399). Мне нужны только последние четыре цифры времени, чтобы соответствовать им, например, с 21: 53: 28.339, мне нужно только "8.339". По большей части индексирование числа в виде строки работает просто отлично (например: timeList [nid] [7:]), за исключением ситуаций, таких как числа, перечисленные выше, где раунды python от .3399 до .34.

Есть ли способ сохранить числа в форме с плавающей запятой и выбрать не округленные цифры из данных?

Спасибо!

Теги:
string
floating-point
indexing

3 ответа

3

edit - использование Decimal исключительно - с полным примером

import decimal

def simplify(text):
    # might be a : separated value
    text = text.split(':')[-1]
    # turn into decimal
    number = decimal.Decimal(text)
    # remove everything but the ones place and forwards
    number = number - (number/10).quantize(1, rounding=decimal.ROUND_FLOOR) * 10
    # truncate to the thousandths
    return number.quantize(decimal.Decimal('.001'), rounding=decimal.ROUND_FLOOR)

a = '121082008.3399'
b = '21:53:28.339'

assert simplify(a) == simplify(b)
print simplify(a), '=', simplify(b)

Скотт, если вы сравниваете числа, используя строки, тогда вам не нужны какие-либо поплавки, и не будет "округления".

'8.339' == '8.339'

или, если у вас есть

a = '8.3399'
b = '8.339'

затем

a[:-1] == b

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

from decimal import Decimal
number_a = Decimal(a[:-1])
number_b = Decimal(b)

Теперь

number_a == number_b

Надеюсь, что поможет

1

Из вашего описания видно, что вы хотите сравнить, используя одну цифру перед десятичной точкой и 3 цифры после десятичной точки, используя усечение вместо округления. Так просто сделайте это:

>>> def extract(s):
...     i = s.find('.')
...     return s[i-1:i+4]
...
>>> map(extract, ['21:53:28.339', '121082008.3399'])
['8.339', '8.339']
>>>
0

Используйте decimal.Decimal вместо float.

  • 0
    Любые идеи о том, как я могу игнорировать первую часть числа (из 121082008.3399 я хочу только 8,339 - в основном просто отрубая первую и последнюю часть числа.) При использовании десятичного модуля? Спасибо!
  • 0
    @ Скотт: использование десятичного модуля является чрезмерным излишним ... просто нарежьте свои строки; смотри мой ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню