这是任务:
使函数
my_map_k
作为参数接受函数f和k 列出L 1 ,...,L k ,任意k≥1,并返回列表 [f(L 1 [0],...,L k [0]),...,f(L 1 [ n-1],...,L k [n-1])],其中n是长度 L i 列表中最短的一个。提示。使用Python的
*
表示法处理任意数量的列表作为参数。示例:
my_map_k(lambda x, y, z: x*y*z, [3, 2, 5], [2, 7, 9], [1, 2])
应返回
[6, 28]
。
这是我走了多远,但是我被困住了。
def my_map_k(f, *L):
n = len(min(*L, key=len))
x=0
while x < n:
return [f(*L[x],) for x in L]
my_map_k(lambda x, y, z: x*y*z, [3, 2, 5], [2, 7, 9], [1, 2])
问题是,我不能只说有3个列表,因为可能还有更多。此外,我看不到如何从所有三个列表中删除第一个元素。
答案 0 :(得分:3)
您可以使用zip()
从每个列表中依次获取第 n 个元素,并使用list comprehension来调用提供的函数,这样生成的每组参数:
def my_map_k(f, *lists):
return [f(*args) for args in zip(*lists)]
这里正在起作用:
>>> my_map_k(lambda x, y, z: x*y*z, [3, 2, 5], [2, 7, 9], [1, 2])
[6, 28]
答案 1 :(得分:1)
我知道了:
def my_map_k(f, *L):
z = zip(*L)
l = list(z)
return ([f(*x) for x in l])
my_map_k(lambda x, y, z: x*y*z, [3, 2, 5], [2, 7, 9], [1, 2])
答案 2 :(得分:0)
这是不使用内置地图功能的解决方案:
from itertools import starmap
def my_map_k(f, *L):
return list(starmap(f, zip(*L)))
答案 3 :(得分:0)
没有辅助功能的解决方案:
from operator import add
def my_map_k(f, *L):
ind = 0
while True:
try:
yield f(*[l[ind] for l in L])
except IndexError:
break
else:
ind += 1
result = my_map_k(add, range(5), range(5))
print(list(result))
# [0, 2, 4, 6, 8]