在列表中将两个数字相加并在列表中输出 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 集合以更少的行数编写相同的代码。
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 函数。
我给 map 函数两个参数,其中一个是 range(len(l))
如果你尝试打印 在上面的例子中,这将输出到 range(0,5)
尝试将其转换成列出 list(range(len(l)))
这将输出 [0,1,2,3,4]
.
Map函数遍历此列表并设置e的值(前提是这是lambda函数中的参数。您可以将其更改为任何其他名称。)
行map(lambda e:l[e]+l[e-1] if e!=0 else l[e]
。这里我匹配的是如果e不等于0,因为如果e是0那么e-1就是-1会指向列表的最后一个元素从而导致代码输出错误。
在我的代码中,如果 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
我想将两个数字添加到彼此相邻的列表中,并且 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 集合以更少的行数编写相同的代码。
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 函数。
我给 map 函数两个参数,其中一个是
range(len(l))
如果你尝试打印 在上面的例子中,这将输出到range(0,5)
尝试将其转换成列出list(range(len(l)))
这将输出[0,1,2,3,4]
.Map函数遍历此列表并设置e的值(前提是这是lambda函数中的参数。您可以将其更改为任何其他名称。)
行
map(lambda e:l[e]+l[e-1] if e!=0 else l[e]
。这里我匹配的是如果e不等于0,因为如果e是0那么e-1就是-1会指向列表的最后一个元素从而导致代码输出错误。在我的代码中,如果 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