在列表中将两个数字相加并在列表中输出 return

Add two numbers next to each other in a list and return output also in list

我想将两个数字添加到彼此相邻的列表中,并且 return 使用 python 列表中的最终答案。 例如 my_list = [1,2,3,5,6] 最终列表将是 [1,3,5,8,11] 第一个数字我将初始值视为 0.

我试过这种方式得到答案

list1 = [1,2,3,0,5,6]

first_value = 0
    new_list = []
    for i,each_value in enumerate(list1):
        if i == 0:
            sum = first_value + each_value
           
        else:
            sum = each_value + prev_val
        new_list.append(sum)
        #i = i+1
        prev_val = each_value
    print(new_list)
        

我已经得到了我想要的输出,但我想知道我们是否可以通过使用 lambda 或一些 python 集合以更少的行数编写相同的代码。

您可以使用简单的 zip + map/sum:

my_list = [1,2,3,5,6]

out = list(map(sum, zip([0]+my_list, my_list)))

输出:[1, 3, 5, 8, 11]

itertools.pairwise (python ≥ 3.10):

from itertools import pairwise

out = my_list[:1]+list(map(sum, pairwise(my_list)))

试试这个。

l = [1,2,3,5,6]

def sum_(l):
    return list(map(lambda e:l[e]+l[e-1] if e!=0 else l[e], range(len(l))))
    

print(sum_(l))

输出[1, 3, 5, 8, 11]

说明

我建议阅读本文后您需要看一下 map 函数。
  1. 我给 map 函数两个参数,其中一个是 range(len(l)) 如果你尝试打印 在上面的例子中,这将输出到 range(0,5) 尝试将其转换成列出 list(range(len(l))) 这将输出 [0,1,2,3,4].

  2. Map函数遍历此列表并设置e的值(前提是这是lambda函数中的参数。您可以将其更改为任何其他名称。)

  3. map(lambda e:l[e]+l[e-1] if e!=0 else l[e]。这里我匹配的是如果e不等于0,因为如果e是0那么e-1就是-1会指向列表的最后一个元素从而导致代码输出错误。

  4. 在我的代码中,如果 e 等于 0,那么这将是 return lst[e],否则这将是 return lst[e]+lst[e-1]。

我希望这会解释这个。

在python3.10+,我喜欢这样做:

>>> from itertools import pairwise, starmap
>>> from operator import add
>>> lst = [1, 2, 3, 5, 6]
>>> out = lst[:1]
>>> out.extend(starmap(add, pairwise(lst)))
>>> out
[1, 3, 5, 8, 11]

一些测试:

from itertools import pairwise, starmap
from operator import add
from timeit import timeit


def starmap_add_extend(lst: list):
    out = lst[:1]
    out.extend(starmap(add, pairwise(lst)))
    return out


def map_sum_extend(lst: list):
    out = lst[:1]
    out.extend(map(sum, pairwise(lst)))
    return out


def starmap_add_concat(lst: list):
    return lst[:1] + list(starmap(add, pairwise(lst)))


def map_sum_concat(lst: list):
    return lst[:1] + list(map(sum, pairwise(lst)))


def comperhension_concat(lst: list):
    return lst[:1] + [i + j for i, j in pairwise(lst)]


def generator_extend(lst: list):
    out = lst[:1]
    out.extend(i + j for i, j in pairwise(lst))
    return out


def comperhension(lst: list):
    return [val + lst[i - 1] if i else val for i, val in enumerate(lst)]


if __name__ == '__main__':
    my_lst = [1, 2, 3, 5, 6]
    for func in (
            starmap_add_extend,
            map_sum_extend,
            starmap_add_concat,
            map_sum_concat,
            comperhension_concat,
            generator_extend,
            comperhension
    ):
        print(func.__name__.ljust(20), timeit(lambda: func(my_lst)))

输出:

starmap_add_extend   0.5148536000051536
map_sum_extend       0.6762464999919757
starmap_add_concat   0.530809899995802
map_sum_concat       0.7072772000101395
comperhension_concat 0.545955400011735
generator_extend     0.7146139999968
comperhension        0.6786505000200123