2011-04-24 49 views
1

我有兩組數據,我通過Python中的嵌套for循環讀取。我需要使用一個公共的數字(時間)匹配兩個不同文本文件的行。在這兩個文件中,時間的寫法是不同的(例如21:53:28.339與121082008.3399)。我只需要時間的最後四位數來匹配它們,例如21:53:28.339,我只需要'8.339'。大多數情況下,除了上面列出的數字之外的情況(python輪換.3399到.34),將數字索引爲一個字符串可以很好地工作(例如:timeList [nid] [7:])。Python:索引浮動?

有沒有辦法讓我把數字保持爲浮點形式並從數據中選擇不帶數字的數字?

謝謝!

回答

0

使用decimal.Decimal而不是float

+0

對我怎麼能夠無視數的第一部分的任何想法(從121082008.3399我只想8.339 - 基本上只是斬去號碼的第一個和最後一個部分。)同時使用十進制模塊?謝謝! – Scott 2011-04-24 21:26:25

+0

@Scott:使用十進制模塊是極端的矯枉過正......只是把你的字符串切碎;看到我的答案。 – 2011-04-24 23:34:20

3

編輯 - 使用十進制專門 - 全例如

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'] 
>>>