2014-11-21 32 views
2

發生奇怪的錯誤。錯誤轉換爲浮點數,然後在Python中int

我知道這個問題,試圖投與小數字符串直接進入整型:

int(float('0.0')) 

作品,而

INT( '0.0')

沒有。不過,我仍然得到一個錯誤,我似乎無法弄清楚:

field = line.strip().split() 
data[k,:] = [int(float(k)) for k in field[1:]] 

ValueError: invalid literal for long() with base 10: '0.0'

任何想法可能在這裏發生了什麼?劇本似乎認爲這是一個演員而不是浮動。任何方式說服它呢?

在此先感謝!

編輯:數據line的形式爲:

'c1c9r2r8\t0.0\t3.4\t2.1\t9.0\n' 
+0

因爲 '0.0' 的點。它不能轉換整數。 – 2014-11-21 03:46:07

+0

你錯過了這一點。以交互方式啓動python並輸入int(float('0.0'))返回0. – ArturJ 2014-11-21 03:47:15

+0

嘗試'int(0.0)'(排除單引號) – Tico 2014-11-21 03:54:07

回答

4

看來發生了什麼是列表理解正在污染你的命名空間。

例如。

k = 0 
[k for k in range(10)] 

在python 2.x的執行上面的代碼之後的k值將是9(即由range(10)產生的最後一個值)。

我會簡化你的代碼,告訴你發生了什麼。

>>> l = [None, None, None] 
>>> k = 0 
>>> l[k] = [k for k in range(3)] 
>>> print k, l 
2 [None, None, [0, 1, 2]] 

你看到l[k]評估,以l[2]而非l[0]。爲避免這種命名空間污染,不要像在外部代碼中那樣在列表理解中使用相同的變量名稱,要麼使用python 3.x,其中列表推導的內部變量不再轉移到外部代碼。

的Python 2.x的代碼應修改是這樣的:

data[k,:] = [int(float(_k)) for _k in field[1:]] 
+0

啊,你是完全正確的。沒有抓住那個。我以爲我瘋了! – ArturJ 2014-11-21 20:42:02

2
>>> line = 'c1c9r2r8\t0.0\t3.4\t2.1\t9.0\n' 
>>> field = line.strip().split() 
>>> field 
['c1c9r2r8', '0.0', '3.4', '2.1', '9.0'] 
>>> [int(x) for x in map(float, field[1:])] 
[0, 3, 2, 9] 
+1

工作!謝謝你,@海雀-GDI! 如果我可以問,任何想法爲什麼上述不會工作,這是嗎? – ArturJ 2014-11-21 04:01:38

+0

我認爲這也是工作。也許你按問題檢查你的代碼。數據[k ,:]'或其他錯誤。 :) – 2014-11-21 04:04:32

2

你的錯誤是從分配data[k, :] = ...的左側到來。在這裏你試圖用一個字符串(k)索引一個NumPy數組(data)。 NumPy嘗試將該字符串隱式轉換爲可用的整數索引,並且失敗。例如:

>>> import numpy as np 
>>> data = np.arange(12).reshape(3, 4) 
>>> data['3.4', :] = 6 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: invalid literal for long() with base 10: '3.4' 

在這裏使用整數而不是字符串,問題應該消失。