我有一个数字列表,如[1,2,3,4,5...]
,我想计算(1+2)/2
,第二,(2+3)/2
第三,
(3+4)/2
等等.我怎样才能做到这一点?
我想将第一个数字与第二个数字相加并除以2,然后将第二个数字与第三个相加并除以2,依此类推.
另外,我如何总结一个数字列表?
a = [1, 2, 3, 4, 5, ...]
Run Code Online (Sandbox Code Playgroud)
是吗:
b = sum(a)
print b
Run Code Online (Sandbox Code Playgroud)
得到一个号码?
这对我不起作用.
Kar*_*tel 261
问题1:你想要(元素0 +元素1)/ 2,(元素1 +元素2)/ 2,......等等.
我们制作两个列表:除了第一个之外的每个元素之一,以及除了最后一个之外的每个元素之一.然后我们想要的平均值是从两个列表中取得的每对的平均值.我们用来zip
从两个列表中取对.
我假设您希望在结果中看到小数,即使您的输入值是整数.默认情况下,Python执行整数除法:它会丢弃余数.为了将事情分开,我们需要使用浮点数.幸运的是,将一个int除以float将产生一个浮点数,所以我们只使用2.0
我们的除数而不是2
.
从而:
averages = [(x + y) / 2.0 for (x, y) in zip(my_list[:-1], my_list[1:])]
Run Code Online (Sandbox Code Playgroud)
问题2:
这种用法sum
应该可以正常使用.以下作品:
a = range(10)
# [0,1,2,3,4,5,6,7,8,9]
b = sum(a)
print b
# Prints 45
Run Code Online (Sandbox Code Playgroud)
此外,您不需要在整个过程中的每一步都将所有内容分配给变量.print sum(a)
工作得很好.
您必须更准确地了解您所写的内容以及它的工作方式.
Raf*_*ler 103
数字总和:
sum(list_of_nums)
Run Code Online (Sandbox Code Playgroud)
使用列表推导计算n和n - 1的一半(如果我有正确的模式):
[(x + (x - 1)) / 2 for x in list_of_nums]
Run Code Online (Sandbox Code Playgroud)
求和相邻元素,例如((1 + 2)/ 2)+((2 + 3)/ 2)+ ...使用reduce和lambdas
reduce(lambda x, y: (x + y) / 2, list_of_nums)
Run Code Online (Sandbox Code Playgroud)
Eva*_*thi 65
问题2: 总结一个整数列表:
a = [2, 3, 5, 8]
sum(a)
# 18
# or you can do:
sum(i for i in a)
# 18
Run Code Online (Sandbox Code Playgroud)
如果列表包含整数作为字符串:
a = ['5', '6']
# import Decimal: from decimal import Decimal
sum(Decimal(i) for i in a)
Run Code Online (Sandbox Code Playgroud)
Md.*_*que 31
你可以这样试试:
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sm = sum(a[0:len(a)]) # Sum of 'a' from 0 index to 9 index. sum(a) == sum(a[0:len(a)]
print(sm) # Python 3
print sm # Python 2
Run Code Online (Sandbox Code Playgroud)
小智 25
>>> a = range(10)
>>> sum(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not callable
>>> del sum
>>> sum(a)
45
Run Code Online (Sandbox Code Playgroud)
似乎sum
已在某处的代码中定义并覆盖默认函数.所以我删除了它,问题解决了.
And*_*reL 16
使用简单list-comprehension
和sum
:
>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
Run Code Online (Sandbox Code Playgroud)
Ely*_*Ely 12
所有答案确实显示了程序化和一般方法.我建议采用针对您的情况的数学方法.对于长列表,它可以更快.它的工作原理是因为您的列表是一个自然数列表,最多可达n
:
我们假设我们有自然数1, 2, 3, ..., 10
:
>>> nat_seq = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Run Code Online (Sandbox Code Playgroud)
您可以sum
在列表中使用该功能:
>>> print sum(nat_seq)
55
Run Code Online (Sandbox Code Playgroud)
您还可以使用公式n*(n+1)/2
where n
列表中最后一个元素的值(此处为nat_seq[-1]
:),以避免迭代元素:
>>> print (nat_seq[-1]*(nat_seq[-1]+1))/2
55
Run Code Online (Sandbox Code Playgroud)
要生成序列,(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]
Run Code Online (Sandbox Code Playgroud)
在这里,您也可以使用该sum
列表中的函数:
>>> print sum(new_seq)
49.5
Run Code Online (Sandbox Code Playgroud)
但您也可以使用公式(((n*2+1)/2)**2-1)/2
,这样可以避免迭代元素:
>>> print (((new_seq[-1]*2+1)/2)**2-1)/2
49.5
Run Code Online (Sandbox Code Playgroud)
解决此问题的最简单方法:
l =[1,2,3,4,5]
sum=0
for element in l:
sum+=element
print sum
Run Code Online (Sandbox Code Playgroud)
这么多解决方案,但我最喜欢的仍然缺失:
>>> import numpy as np
>>> arr = np.array([1,2,3,4,5])
Run Code Online (Sandbox Code Playgroud)
numpy 数组与列表(在本用例中)没有太大区别,除了您可以将数组视为数字:
>>> ( arr[:-1] + arr[1:] ) / 2.0
[ 1.5 2.5 3.5 4.5]
Run Code Online (Sandbox Code Playgroud)
完毕!
解释
花哨的索引意味着:[1:]
包括从 1 到结尾的所有元素(因此省略了元素 0),并且[:-1]
是除最后一个之外的所有元素:
>>> arr[:-1]
array([1, 2, 3, 4])
>>> arr[1:]
array([2, 3, 4, 5])
Run Code Online (Sandbox Code Playgroud)
因此,将这两个相加会得到一个由 (1+2)、(2+3) 等元素组成的数组。请注意,我正在除以2.0
,不是2
因为否则 Python 认为您只使用整数并产生四舍五入的整数结果。
使用 numpy 的优势
NumPy的可远快于各地的号码清单循环。根据您的列表有多大,速度会快几个数量级。此外,它的代码要少得多,至少对我来说,它更容易阅读。我试图养成对所有数字组都使用 numpy 的习惯,这对我本来必须编写的所有循环和循环内循环来说都是一个巨大的改进。
归档时间: |
|
查看次数: |
1541223 次 |
最近记录: |