给定一个数字列表,例如:
[1, 2, 3, 4, 5, ...]
我如何计算它们的总和:
1 + 2 + 3 + 4 + 5 + ...
我如何计算他们的两两平均值:
[(1+2)/2, (2+3)/2, (3+4)/2, (4+5)/2, ...]
给定一个数字列表,例如:
[1, 2, 3, 4, 5, ...]
我如何计算它们的总和:
1 + 2 + 3 + 4 + 5 + ...
我如何计算他们的两两平均值:
[(1+2)/2, (2+3)/2, (3+4)/2, (4+5)/2, ...]
当前回答
使用成对的itertools食谱:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
def pair_averages(seq):
return ( (a+b)/2 for a, b in pairwise(seq) )
其他回答
使用成对的itertools食谱:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return itertools.izip(a, b)
def pair_averages(seq):
return ( (a+b)/2 for a, b in pairwise(seq) )
所有的回答都显示了一种纲领性和一般性的方法。我建议用一种数学方法来解决你的问题。它可以更快,特别是对于长列表。它之所以有效,是因为你的列表是一个到n的自然数列表:
假设我们有自然数1,2,3,…10:
>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
你可以在列表中使用求和函数:
>>> print sum(nat_seq)
55
你也可以使用公式n*(n+1)/2,其中n是列表中最后一个元素的值(这里:nat_seq[-1]),这样你就可以避免遍历元素:
>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55
生成序列(1+2)/2,(2+3)/2,…,(9+10)/2你可以使用生成器和公式(2*k-1)/2。(注意点使值为浮点)。在生成新列表时,必须跳过第一个元素:
>>> new_seq = [(2*k-1)/2. for k in nat_seq[1:]]
>>> print new_seq
[1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5]
在这里,你也可以使用列表中的sum函数:
>>> print sum(new_seq)
49.5
但是你也可以使用公式(((n*2+1)/2)**2-1)/2,这样你就可以避免遍历元素:
>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5
一种简单的方法是使用iter_tools排列
# If you are given a list
numList = [1,2,3,4,5,6,7]
# and you are asked to find the number of three sums that add to a particular number
target = 10
# How you could come up with the answer?
from itertools import permutations
good_permutations = []
for p in permutations(numList, 3):
if sum(p) == target:
good_permutations.append(p)
print(good_permutations)
结果是:
[(1, 2, 7), (1, 3, 6), (1, 4, 5), (1, 5, 4), (1, 6, 3), (1, 7, 2), (2, 1, 7), (2, 3,
5), (2, 5, 3), (2, 7, 1), (3, 1, 6), (3, 2, 5), (3, 5, 2), (3, 6, 1), (4, 1, 5), (4,
5, 1), (5, 1, 4), (5, 2, 3), (5, 3, 2), (5, 4, 1), (6, 1, 3), (6, 3, 1), (7, 1, 2),
(7, 2, 1)]
注意,顺序很重要——即1,2,7也表示为2,1,7和7,1,2。您可以通过使用集合来减少这种情况。
这么多解决方案,但我最喜欢的还是没有:
>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])
numpy数组与列表没有太大区别(在这个用例中),除了你可以像对待数字一样对待数组:
>>> ( arr[:-1] + arr[1:] ) / 2.0
[ 1.5 2.5 3.5 4.5]
完成了!
解释
花式索引的意思是:[1:]包括从1到最后的所有元素(因此省略了元素0),而[:-1]是除了最后一个以外的所有元素:
>>> arr[:-1]
array([1, 2, 3, 4])
>>> arr[1:]
array([2, 3, 4, 5])
将这两个元素相加,就得到了一个包含元素(1+2)(2+3)等的数组。 请注意,我是除以2.0,而不是2,因为否则Python认为您只使用整数并产生四舍五入的整数结果。
使用numpy的优点
Numpy比围绕数字列表的循环要快得多。这取决于你的列表有多大,快几个数量级。此外,它的代码更少,至少对我来说,它更容易阅读。 我正在努力养成对所有数字组都使用numpy的习惯,这对于我本来必须编写的所有循环和循环中的循环是一个巨大的改进。
让我们让初学者容易:-
global关键字将允许在主函数中分配全局变量消息,而不产生新的局部变量
message = "这是一个全局变量!" def main (): 全球信息 message = "This is a local" 打印(消息) main () #输出“这是一个本地”-从函数调用 打印(消息) #输出“This is a local”——从外部作用域
这个概念叫做影子
在Python中对数字列表求和
Nums = [1,2,3,4,5] Var = 0 def金额(): 对于nums中的num: 全局变量 Var = Var + num 打印(var) 如果__name__ == '__main__': 金额()
输出= 15