2014-09-12 47 views
-2

我想所有的數字四捨五入至小數點後兩位在下面列出的清單列表:四捨五入號碼列表

a = [[4.5555, 5.6666, 8.3365], [10.4345, 1.574355. 0.7216313]] 
b = [x for x in a for y in [round(z, 2) for z in x]] 

我試圖用一個列表理解來做到這一點,但無法實現。 b變量只返回與a相同的東西。這是最好的辦法嗎?有更好的替代方法嗎?謝謝!

+0

請你告訴我們你的列表中理解的嘗試。 – 2014-09-12 14:23:47

+0

不要嘗試對數字進行舍入,因爲您始終有一些浮點錯誤。當你打印出來時,只需圍繞它們。無論何時進行計算,您都應該使用您擁有的最大數字位數進行計算。 – Ffisegydd 2014-09-12 14:23:53

+0

考慮numpy:'np.round()'將在多維數據上工作沒有問題。 – mdurant 2014-09-12 14:31:44

回答

2

您需要您的列表理解:

[[np.round(float(i), 2) for i in nested] for nested in outerlist] 

外部列表理解循環在你的外列表對象,然後應用內部列表理解每個子列表。這種嵌套理解適用於生成新的子列表,因此您將其放在左側。

+0

好吧,我只是顛倒嵌套列表理解...現在作品謝謝! – KidSudi 2014-09-12 14:31:42

1

你的標籤suggset a實際上是一個Numpy數組,而不是一個嵌套的Python列表。在這種情況下,你可以使用數組對象的round()方法來獲取數組的圓形副本:

>>> a = numpy.random.randn(3, 3) 
>>> a 
array([[ 1.46998835, 0.62139675, 0.37665545], 
     [-0.79925019, -0.51251798, 1.36500036], 
     [ 0.66339687, -1.22586919, 1.68054346]]) 
>>> a.round(3) 
array([[ 1.47 , 0.621, 0.377], 
     [-0.799, -0.513, 1.365], 
     [ 0.663, -1.226, 1.681]]) 

你能讓到位陣列,而不創建副本,使用a.round(3, out=a)

+0

刪除了numpy標籤 – KidSudi 2014-09-12 14:34:22

+0

@KidSudi:如果你想執行這樣的操作,你應該使用Numpy,因爲它會容易得多。 (你的代碼示例仍然使用'np.round()'。) – 2014-09-12 14:35:14

+0

我的數據實際上是從數據框中收集的。我想用matplotlib繪製數據框的表格,但是從我收集的內容來看,您無法創建表格數字。因此,我將數據幀中的數據導出到列表列表中(即每個列表都是數據幀中的一行)。然後,我只在一個情節圖中繪製了這張表。不知道是否有更好的方式去做這件事...... – KidSudi 2014-09-12 14:40:35

0

你可以叫你np.round名單列表上,不需要修真

import numpy as np 
a = ([[4.5555, 5.6666, 8.3365], [10.4345, 1.574355, 0.7216313]]) 
print np.round(a,2) 
[[ 4.56 5.67 8.34] 
[ 10.43 1.57 0.72]]