2014-09-12 48 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]]