我在python中有一个列表
l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]
如果element <=0.5
,请返回0
,
如果element > 0.5
,请返回1
因此产生的l应该如下:
l=[[0,0,1],[0,0,1],[1,0,1]]
提前致谢!
答案 0 :(得分:0)
查看round
。
>>> l=[[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]
>>> [[round(x) for x in i] for i in l]
[[0, 0, 1], [0, 0, 1], [1, 0, 1]]
正如@iAdjunct在评论中提到并在this问题中讨论的那样,如果在python 2上工作,那么不会产生所需的输出。
那是因为他们采用了不同的舍入方法。这些例子可以说明不同之处:
Python2:
>>> round(0.5)
1.0
Python3
>>> round(0.5)
0
答案 1 :(得分:0)
有几种方法可以做到这一点;无论是通过列表理解的纯Python还是使用第三方库的矢量化方式。
纯Python
您可以使用嵌套列表解析。
l = [[0.1,0.2,0.9],[0.3,0.4,0.6],[0.8,0.2,0.8]]
res = [[0 if i <= 0.5 else 1 for i in row] for row in l]
[[0, 0, 1], [0, 0, 1], [1, 0, 1]]
Vectorised alternative
这使用第三方库numpy
。
import numpy as np
res = np.where(np.array(l) <= 0.5, 0, 1)
array([[0, 0, 1],
[0, 0, 1],
[1, 0, 1]])
有关四舍五入的说明
由于float
不是以基本10格式存储数字数据的性质,因此难以将浮点数与浮点数进行比较。有关详细信息,请参阅Is floating point math broken?。即使使用上述方法,这也是一个问题。
这意味着您可能需要特别注意边界情况,如果这对您很重要。