Python:如何在不创建整个列表的情况下计算列表总和?

时间:2017-02-06 01:32:36

标签: python list sum yield

通常我们必须(1)声明一个列表(2)使用sum()计算此列表的总和

但现在我希望指定一个列表以1开头,间隔4,100个元素,如下所示:

[1,5,9,13,17,21,25,29,33,37,…]

我不想涉及数学公式,所以

  

(1)如何在没有声明此列表的情况下获得总和?

     

(2)如何快速从该列表的第101个元素到第200个元素求和?

4 个答案:

答案 0 :(得分:2)

内置类range确实完全符合您在Python 3中的要求。在Python 2中,使用xrange。代替。例如:

for i in range(1, 401, 4): ... 

range对象不包含完整列表。它仅记录开始,结束和步长。迭代器也会记录当前位置。

在Python 2中使用xrange很重要,因为范围函数将返回整个列表,这与您想要的完全相反。

a = range(1, 401, 4)
sum(a) 

将计算您想要的总和,并允许您在之后重复使用a

关于号码401的说明

范围的结尾是独家的。有几个常用公式可以获得范围内正确数量的元素。 start + count * step是我在这里选择的,因为它是最简单的。它也是将count而不是count + 1元素赋予范围的最大数字。 start + (count - 1) * step + 1是为您提供count元素的最小数字的公式。由于您需要100个元素,因此结束值398,399或400将获得与401相同的结果。

答案 1 :(得分:2)

只需使用itertools.count获取计数器,itertools.islice即可获得所需数量的元素(您可以迭代这些实例但不创建列表!):

>>> from  itertools import count, islice
>>> sum(islice(count(1, step=4), 100))  # get the first 100 elements and sum them
19900

islice也支持开始/停止:

>>> sum(islice(count(1, step=4), 101, 200))  # 101st element to 200th
59499

答案 2 :(得分:1)

您可以使用sum生成器来避免首先创建列表:

result = sum(x for x in range(1, 401, 4))

正如@Mad Physicist在评论中提到的,你甚至不需要x for x部分:

result = sum(range(1, 401, 4))

答案 3 :(得分:1)

你可以写一个发电机:

def ir(start=1, end=400, step=4):
    while True:
        yield start
        start+=step
        if start>=end: break

或者,如果您想要特定数量的元素:

def ir(start=1, n=100, step=4):
    cnt=0
    while True:
        yield start
        cnt+=1
        start+=step
        if cnt>=n: break

然后总结一下:

 >>> sum(ir())
 19900