在Python中汇总一个数字列表

lay*_*ayo 345 python sum list

我有一个数字列表,如[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)工作得很好.

您必须更准确地了解您所写的内容以及它的工作方式.

  • `my_list`仅在您定义时定义.这应该是一个占位符,无论你称之为你正在尝试使用的列表.我无法猜出你的名字. (34认同)
  • 由于“zip”一旦到达较短参数的末尾就会停止,因此“zip(my_list, my_list[1:])”就足够了。 (5认同)
  • @KarlKnechtel 他的问题中确实有一个列表,它被称为“`a`”。 (2认同)

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)+ ...使用reducelambdas

reduce(lambda x, y: (x + y) / 2, list_of_nums)
Run Code Online (Sandbox Code Playgroud)

  • 我认为他想要相加元素.取"x"和"x - 1"的平均值是没有意义的; 我们可以减去0.5而不是. (4认同)
  • reduce功能不符合帖子的说法.它计算(((a1 + a2)/ 2 + a3)/ 2 + a4)/ 2 ...... (3认同)

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)

  • `sum(十进制(i)for i in a)`=>`sum(int(i)for i in a)`或`sum(map(int,a))` (4认同)
  • `sum(i for i in a)`只是多余的. (3认同)

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)

  • 没有必要像这样创建一个副本,它是非常非常的.像瘟疫一样避免所有选票...... (4认同)
  • 对于初学者来说,`a[0:len(a)]` 创建了 `a` 的副本,除了浪费 CPU 和内存之外还有什么意义?那么 `print(sm)` 也适用于 python 2。我不明白为什么这在 2017 年中期有这么多的赞成票......但它适用于这里的大多数答案。 (2认同)

小智 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-comprehensionsum:

>> sum(i for i in range(x))/2. #if x = 10 the result will be 22.5
Run Code Online (Sandbox Code Playgroud)

  • 你不需要使用`[`和`]`,你可以只传递生成器表达式`sum(i/2.对于i在范围(x)中)` (4认同)

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)/2where 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)


Vij*_*jay 11

这个问题已经回答 这里

a = [1,2,3,4]
sum(a) 
Run Code Online (Sandbox Code Playgroud)

sum(a) 返回 10


sha*_*nkS 5

解决此问题的最简单方法:

l =[1,2,3,4,5]
sum=0
for element in l:
    sum+=element
print sum
Run Code Online (Sandbox Code Playgroud)


Zak*_*Zak 5

这么多解决方案,但我最喜欢的仍然缺失:

>>> 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 的习惯,这对我本来必须编写的所有循环和循环内循环来说都是一个巨大的改进。