我写了这个解决方案,来自Ruby,看起来非常优雅。但是,这是python程序员这样做的方式吗?
a = [[2,3,4], [9,1,2]]
print map(lambda(i): map(lambda(p): p/10.0,i), a)
而且......如果不是10,我想使用嵌套的2d列表中所有值的总和?
答案 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在不同版本中返回相同的结果。