列表的总和和长度

时间:2014-11-29 13:12:14

标签: python list python-2.7

列表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]]

1 个答案:

答案 0 :(得分:2)

也可以使用sum()计算非零值:

l = [sum(v != 0 for v in i) for i in a]

这使用了Python布尔值的属性:它们是int的子类,并且分别对01具有整数值FalseTrue。因此,求和布尔值会给出一个整数结果,让您计算有多少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在计算比率时不使用整数除法。