Python中的列表(如何添加元素)
我刚开始学习Python,之前学过Haskell。在Haskell中,我大部分时间都在处理列表。在Python中,我也想这样做。
我有一个列表:
l = [1,2,3,4]
我想把列表中的4个元素加起来,得到10这个结果(1+2+3+4)。
我需要一个递归函数和一个迭代函数(虽然迭代的方式不够简洁和稳定,但还是需要)。
在Haskell中,我是这样做的:
sum [] = 0
sumlist(x:xs) = x + sumlist xs
在Python中,我尝试了这个:
def sumlist(l)
if l == 0: #or Nil, i do not know
result 0
else:
l [0] + sumlist(l)
但这个方法不行,可能是因为我还是太专注于Haskell的实现方式了。
如果能得到一些帮助,那就太好了。
5 个回答
这里有两种方法可以计算总和:
第一种是直接使用内置的求和函数:
sum(l)
第二种是用一个循环来实现:
sum_val = 0
for i in range(0, len(l)):
sum_val += l[i]
用递归来计算总和其实是在浪费计算资源。除非真的必要,否则不要使用递归。
你的代码其实没差太多。空列表被认为是“假”的,所以你可以这样做:
def sumlist(lst):
if not lst:
return 0
else:
# Add the first element to the sum of the remaining elements.
return lst[0] + sumlist(lst[1:])
当然,我是基于你在做一个关于递归的作业来假设的——在实际的生产代码中这样做会很糟糕,你应该直接使用 sum
这个内置函数。
如果你想找一种方法,而不是直接用很明显的 sum
,你可以使用 reduce:
>>> l = [1,2,3,4]
>>> import operator
>>> reduce(operator.add, l)
10
如果你想用其他的函数,你可以这样做:
def sum_l(l):
rtr=0
while l:
rtr+=l.pop()
return rtr
这个函数会改变原来的列表。如果你想保留原来的列表,可以用这个列表的一个副本来调用它:
n=sum_l(l[:])
还有一种方法(不会改变原来的列表)是用一个循环来遍历这个可迭代对象:
def sum_l(l):
rtr=0
for e in l:
rtr+=e
return rtr
编辑:
如果你不想使用 sum
,你可以自己写一个函数1:
>>> def sumlist(seq, start=0):
... return sumlist(seq[1:], start + seq[0]) if seq else start
...
>>> lst = [1, 2, 3, 4]
>>> sumlist(lst)
10
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> sumlist(lst)
45
>>> sumlist(lst, 10) # You can specify a number to start at too
55
>>>
1注意:假设你会传入一串数字。
你也可以直接使用内置的 sum
:
>>> l = [1, 2, 3, 4]
>>> sum(l)
10
>>>
来自 文档:
sum(iterable[, start])
这个函数会把
start
和一个可迭代对象中的所有项从左到右相加,最后返回总和。start
默认是 0。可迭代对象里的项通常是数字,而start
的值不能是字符串。
我没有用过Haskell,但在Python中,对象是很丰富的,因为它们知道如何与其他对象互动。你可以把它想象成“对象之间的接口”是大家都很清楚的,每个人都应该表现得很好:
EAFP
比起事先请求许可,更容易事后请求原谅。这是一种常见的Python编码风格,假设某些有效的键或属性是存在的,如果这个假设不成立,就会捕获异常。这种干净且快速的风格通常会有很多try和except语句。这个技巧与许多其他语言(比如C语言)常用的LBYL风格形成对比。
所以,假设标准库中有一个叫做sum的函数,你可以确定它至少会做两件事:
- 知道如何对可以相加的东西进行求和。
- 如果它不知道如何相加,它会抛出一个异常。
一旦你明白了这个工作原理,你就可以开始把任何东西传给sum,看看它会怎么处理:
>>> sum((1,2,3)) # a list
6
>>> sum([1,2,3]) # a tuple
6
>>> sum((1,)) # a tuple with one object
1
>>> sum([2]) # a list with one object
2
只要这个项目是可迭代的,sum就可以正常工作。当然,当你传给它一些它无法处理的东西时,你会得到相应的异常:
>>> sum(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable
>>> sum('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
注意,在Python中,字符串是可迭代的,这就是为什么你会得到不同的异常。
在你评论这里:
有没有其他方法可以求和,还是只有这一种?
值得指出的是,Python之禅,这是一种关于什么让代码“符合Python风格”的指导,里面说:
应该有一种——最好只有一种——明显的方法来做到这一点。
所以,求和的明显方法就是使用一个叫sum的函数。