2017-02-06 32 views
3

通常我们必须(1)声明一个列表(2)使用sum()Python:如何先计算一个列表的总和而不先创建整个列表?

计算该列表的总和但现在我希望指定列表从1开始和间隔4,100个元件,这样:

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

我不想进化得只剩数学公式,所以

(1)如何获得,甚至没有宣布这个名单的总和?

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

回答

2

只需使用itertools.count得到一个计数器和itertools.islice以获得所需数量的元素(你可以ite评价这些情况,但他们没有创建一个列表):

>>> 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 
1

您可以使用发电机,sum,以避免造成在第一的列表:

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

由于@Mad物理学家在评论中提到,你甚至都不需要x for x部分:

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

这不是一个列表中理解和范围传递本身是好的。 –

+0

没问题。请参阅我为其他答案所做的评论。 'x for x in ...'几乎没有必要。 –

+0

它在技术上被称为生成器表达式,而不是理解:http://stackoverflow.com/documentation/python/292/generators#t=201609020956268959493 –

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相同的结果。

+2

这不是真的准确将Python 3的'range'对象描述为一个生成器。它是一个序列对象,而不是迭代器。除了重用它之外,你可以像'len(range(...))'和'range(...)[index_or_slice]'这样的东西来工作。这对发电机来说是不可能的。 – Blckknght

+0

@Blckknght。它绝对是如果生成器定义了适当的方法。但是你是对的,范围不是发电机,因为你不能在旁边打电话。 –

+0

您无法在生成器对象上定义方法。你可以通过调用一个生成器函数(一个函数中带有'yield'表达式)或者使用生成器表达式来创建一个函数。你可以编写自己的迭代器类,但这与生成器不一样。如果你想拥有'__len__'和'__getitem__'方法,你可能希望你的类型是一个序列(比如'range'),而不是迭代器。 – Blckknght

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 
+0

为什么要重新发明轮子? –

+0

因为您可以在自定义函数中包含更多内容,例如跳过第20个或模拟[Gregorian Calendar](https://en.wikipedia.org/wiki/Leap_year) – dawg

相关问题