Python,将2d列表中的所有数字除以10并返回2d列表

时间:2017-09-17 22:43:53

标签: python

我写了这个解决方案,来自Ruby,看起来非常优雅。但是,这是python程序员这样做的方式吗?

a = [[2,3,4], [9,1,2]]
print map(lambda(i): map(lambda(p): p/10.0,i), a)

而且......如果不是10,我想使用嵌套的2d列表中所有值的总和?

3 个答案:

答案 0 :(得分:4)

通常使用理解来解决这个问题,在这种情况下是嵌套列表理解:

>>> from __future__ import division   # for python-2.x compatibility
>>> [[item / 10 for item in subl] for subl in a]
[[0.2, 0.3, 0.4], [0.9, 0.1, 0.2]]

这可能比map更快,并且避免了所有lambda功能。

  

如果不是10,我想使用嵌套的2d列表中所有值的总和?

使用sum和嵌套生成器表达式计算总计:

>>> sum_ = sum(item for subl in a for item in subl)
>>> [[item / sum_ for item in subl] for subl in a]
[[0.09523809523809523, 0.14285714285714285, 0.19047619047619047],
 [0.42857142857142855, 0.047619047619047616, 0.09523809523809523]]

但是使用NumPy阵列它会更容易。 NumPy是第三方套餐,但非常强大而且快速:

>>> import numpy as np
>>> arr = np.array(a)
>>> arr / 10.   # element-wise division
array([[ 0.2,  0.3,  0.4],
       [ 0.9,  0.1,  0.2]])

>>> arr / arr.sum()  # sum over all elements then element-wise division
array([[ 0.0952381 ,  0.14285714,  0.19047619],
       [ 0.42857143,  0.04761905,  0.0952381 ]])

答案 1 :(得分:2)

另一种方法是使用numpy,因为它处理数组,默认情况下它的运算符可以处理数组的每个元素。

In [1]: import numpy as np

In [2]: a = np.array([[2,3,4], [9,1,2]])

In [3]: a/10
Out[3]: 
array([[ 0.2,  0.3,  0.4],
       [ 0.9,  0.1,  0.2]])

要除以所有数字的总和,请执行

In [6]: a/a.sum()
Out[6]: 
array([[ 0.0952381 ,  0.14285714,  0.19047619],
       [ 0.42857143,  0.04761905,  0.0952381 ]])

答案 2 :(得分:1)

列表理解更加优雅,被认为更具Pythonic(具有更好的可读性):

>>> [[x/10.0 for x in lst] for lst in a]
[[0.2, 0.3, 0.4], [0.9, 0.1, 0.2]]

另外,请注意map不会在Python 3中返回一个列表,它会返回一个迭代器对象。您需要在每个地图对象上调用list以将它们评估到列表中。 list comp在不同版本中返回相同的结果。