Python: индексирование плавает? - PullRequest
1 голос
/ 25 апреля 2011

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

Можно ли мне сохранить числа в плавающем виде и выбрать необоснованные цифры из данных?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 25 апреля 2011

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

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 голос
/ 25 апреля 2011

Из вашего описания следует, что вы хотите сравнить, используя одну цифру до десятичной точки и 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 голосов
/ 25 апреля 2011

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

...