如何在不使用内置地图或星图的情况下编写类似星图的函数?

时间:2019-03-08 12:50:56

标签: python python-3.x lambda starmap

这是任务:

  

使函数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个列表,因为可能还有更多。此外,我看不到如何从所有三个列表中删除第一个元素。

4 个答案:

答案 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]