在python中使用给定的索引列表迭代列表

时间:2016-07-02 09:57:46

标签: python list loops

我有一个列表A = [-1, 2, 1, 2, 0, 2, 1, -3, 4, 3, 0, -1]B = [0, 7, 11]。列表B显示负整数索引的索引。

如何返回列表中每个切片的总和:例如A[0+1:7]A[7+1:11]的总和

2 个答案:

答案 0 :(得分:4)

使用zip,您可以将[0, 7, 11]转换为所需的切片索引对(1:7 / 8:11):

>>> zip(B, B[1:])  # In Python 3.x, this will return an iterator.
[(0, 7), (7, 11)]
>>> [(i+1, j) for i, j in zip(B, B[1:])]
[(1, 7), (8, 11)]
>>> [A[i+1:j] for i, j in zip(B, B[1:])]
[[2, 1, 2, 0, 2, 1], [4, 3, 0]]
>>> [sum(A[i+1:j]) for i, j in zip(B, B[1:])]
[8, 7]

<强>更新

在不使用itertools.groupby定义B的情况下完成所需内容的另一种方法:

>>> A = [-8, 3, 0, 5, -3, 12]
>>> import itertools
>>> [sum(grp) for positive, grp in itertools.groupby(A, lambda x: x >= 0) if positive]
[8, 12]

key函数用于分割 0和正数负数数字。

答案 1 :(得分:1)

您可以像使用一行列表理解一样实现。

[sum(A[i+1:B[B.index(i)+1]]) if i != B[-1] else sum(A[i+1:-1]) for i in B]

<强>结果

[8, 7, 0]

如果你不想要最后一个切片和,请使用它。

[sum(A[i+1:B[B.index(i)+1]]) for i in B if i != B[-1]]

<强>结果

[8, 7]