Python中的列表(如何添加元素)

0 投票
5 回答
842 浏览
提问于 2025-04-18 03:37

我刚开始学习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 个回答

0

这里有两种方法可以计算总和:

第一种是直接使用内置的求和函数:

sum(l)

第二种是用一个循环来实现:

sum_val = 0

for i in range(0, len(l)):
    sum_val += l[i]

用递归来计算总和其实是在浪费计算资源。除非真的必要,否则不要使用递归。

1

你的代码其实没差太多。空列表被认为是“假”的,所以你可以这样做:

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 这个内置函数。

1

如果你想找一种方法,而不是直接用很明显的 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
4

编辑:

如果你不想使用 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 的值不能是字符串。

1

我没有用过Haskell,但在Python中,对象是很丰富的,因为它们知道如何与其他对象互动。你可以把它想象成“对象之间的接口”是大家都很清楚的,每个人都应该表现得很好:

EAFP

比起事先请求许可,更容易事后请求原谅。这是一种常见的Python编码风格,假设某些有效的键或属性是存在的,如果这个假设不成立,就会捕获异常。这种干净且快速的风格通常会有很多try和except语句。这个技巧与许多其他语言(比如C语言)常用的LBYL风格形成对比。

所以,假设标准库中有一个叫做sum的函数,你可以确定它至少会做两件事:

  1. 知道如何对可以相加的东西进行求和。
  2. 如果它不知道如何相加,它会抛出一个异常。

一旦你明白了这个工作原理,你就可以开始把任何东西传给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的函数。

撰写回答