列表a
的值为零,在对应点的列表b
中具有非零值:
a = [[0, 2, 2], [2, 0, 0], [2, 0, 1]]
b = [[1, 0, 0], [0, 2, 3], [0, 1, 0]]
我需要b
中每个列表的总和以及a
中每个列表的非零值的长度。我在列表b
中获得了列表总和:
s = [sum(i) for i in b] # output: [1, 5, 1]
但是如何在每个a
列表中获得非零值的长度(预期输出:l = [2, 1, 2]
)并将结果值(s/l
)添加到每个非零值a
的?
预期产出:
[[0, 2.5, 2.5], [7, 0, 0], [2.5, 0, 1.5]]
答案 0 :(得分:2)
也可以使用sum()
计算非零值:
l = [sum(v != 0 for v in i) for i in a]
这使用了Python布尔值的属性:它们是int
的子类,并且分别对0
和1
具有整数值False
和True
。因此,求和布尔值会给出一个整数结果,让您计算有多少v != 0
次测试是真的。
要计算s / l
,请将结果与a
中的嵌套列表一起压缩,然后使用conditional expression将比率添加到每个非零值:
s = [sum(i) for i in b]
l = [sum(v != 0 for v in i) for i in a]
result = [[0 if not v else v + (float(sumb) / count) for v in i]
for i, sumb, count in zip(a, s, l)]
演示:
>>> a = [[0, 2, 2], [2, 0, 0], [2, 0, 1]]
>>> b = [[1, 0, 0], [0, 2, 3], [0, 1, 0]]
>>> s = [sum(i) for i in b]
>>> l = [sum(v != 0 for v in i) for i in a]
>>> l
[2, 1, 2]
>>> [[0 if not v else v + (float(sumb) / count) for v in i]
... for i, sumb, count in zip(a, s, l)]
[[0, 2.5, 2.5], [7.0, 0, 0], [2.5, 0, 1.5]]
您可以先预先计算s / l
比率;如果a
中的嵌套列表非常大,则可以刮几个周期:
ratio_sl = [sum(ib, 0.0) / sum(v != 0 for v in ia) for ia, ib in zip(a, b)]
result = [[0 if not v else v + r for v in i] for i, r in zip(a, ratio_sl)]
结果输出:
>>> ratio_sl = [sum(ib, 0.0) / sum(v != 0 for v in ia) for ia, ib in zip(a, b)]
>>> ratio_sl
[0.5, 5.0, 0.5]
>>> [[0 if not v else v + r for v in i] for i, r in zip(a, ratio_sl)]
[[0, 2.5, 2.5], [7.0, 0, 0], [2.5, 0, 1.5]]
在这里,我使用浮点sum()
查看0.0
,以确保Python 2在计算比率时不使用整数除法。