我有两个长度不等的子列表:
SELECT A.id,
A.accnt,
A.amount,
Sum(I.issued) AS issued
FROM accnttbl A
LEFT JOIN issuedtbl I
ON A.id = I.id
AND Month(I.dateissue) BETWEEN 1 AND 2 -- Right table filter
WHERE Year(A.date) = 2016
GROUP BY A.id,
A.accnt,
A.amount
我需要将所有元素除以10,所以我可以将a = [[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]]
转换为a
数组,然后应用这样的操作:
numpy
但结果是:
np.asarray(a) / 10.
我可以这样做:
TypeError: unsupported operand type(s) for /: 'list' and 'float'
但我很确定这不是pythonic的方法。
对由不同长度的子列表组成的数组应用操作的正确方法是什么?
答案 0 :(得分:3)
您需要numpy
吗?否则你可以使用简单的列表理解:
b = [map(lambda x:x/10, i) for i in a]
答案 1 :(得分:1)
我喜欢它的外观:
In [273]: [(np.array(i)/10).tolist() for i in a]
Out[273]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]
简单地将a
转换为数组并不好,因为它将元素(其中2个)留作列表。
In [275]: np.array(a)
Out[275]: array([[0.2, 0.3], [0.6, 0.5, 0.7, 0.8]], dtype=object)
dtype=object
数组只不过是带有数组包装器的列表。因此,如果要使用数组除法,则需要将子列表转换为数组。
但纯粹的列表理解版本看起来更清晰 - 更加pythonic:
In [279]: [[j/10. for j in i] for i in a]
Out[279]: [[0.02, 0.03], [0.06, 0.05, 0.06999999999999999, 0.08]]
在我的书中,列表推导非常“pythonic”;嵌套的更是如此。 :)不必要地使用numpy
是非pythonic,特别是如果之后需要tolist
。
dtype=object
数组尝试将操作应用于每个元素,例如
np.array(a)/10 => np.array([i/10 for i in a])
它不适用于子列表情况,因为未定义[2,3]/10
。
但是如果我们采取额外步骤将子列表转换为数组:
In [282]: aa=np.array([np.array(i) for i in a])
In [283]: aa/10.
Out[283]: array([array([ 0.02, 0.03]), array([ 0.06, 0.05, 0.07, 0.08])], dtype=object)
然后阵列分工工作。但是,不要指望这项工作适用于所有操作。 dtype=object
数组代码尚未完全开发。
答案 2 :(得分:0)
如果您需要直接修改现有列表,可以执行此操作。
for i1, l in enumerate(a):
for i2, _ in enumerate(l):
a[i1][i2] /= 10