如何使用itertools进行嵌套循环?

时间:2019-01-11 12:46:35

标签: python-3.x for-loop itertools

我正在寻找一种在itertools.accumulate中使用starmap的方法。

我试图计算表中每一行的累加和,然后将结果连接到一个数组:

# my input
my_table = [[3, 5], [1, 4, 7], [2]]
# expected output
P = [3, 8, 1, 5, 12, 2]

我在for循环中使用itertools,但是它比其他方法慢得多。 那么有可能使用starmap或其他itertools方法使其更快吗?

def getSums(my_table):
    P = []
    for i in range(len(my_table)):
       P.append(itertools.accumulate(my_table[i]))
    P = itertools.chain.from_iterable(P)
    return P

3 个答案:

答案 0 :(得分:3)

您不需要starmap,只需使用内置的map函数并使用itertools.chain()链接结果:

In [47]: list(chain.from_iterable(map(accumulate, my_table)))
Out[47]: [3, 8, 1, 5, 12, 2]

答案 1 :(得分:0)

您可以在extend的简化版本中使用初始循环方法,该方法可以进行任何迭代:

P = []
for lst in my_table:
    P.extend(accumulate(lst))

答案 2 :(得分:0)

使用Itertools效果很好,这是实际情况,您可以编写 您自己的解决方案只需使用生成器(无需stdlib)。

def chain_cumsum(table):
    for it in table:
        yield from cumsum(it)

# write a function to get accumulated sum
def cumsum(l):
    total = 0
    for i in l:
        total += i
        yield total

# then you can get your output:
list(chain_cumsum(my_table))