制作影响输入参数索引元素的函数输出列表

making list of function output affecting elements from input args indexes

def task(func, *seq):
"""
The function receives a function and N sequences (lists/tuples).
All sequences have the same length M.
The number of arguments of the func is equal to the number of sequences.
Return a list of [res1, res2, ..., resM], where:

res1 = func(seq1[1], seq2[1], ..., seqN[1])
res2 = func(seq1[2], seq2[2], ..., seqN[2])
...
resM = func(seq1[M], seq2[M], ..., seqN[M])
"""
# BEGIN
  result = [] 
  transpose = list(zip(*seq))
  for i in transpose:
    result.append(func([i]))
  return result

例如,遵循以下逻辑:

lamt = [6, 5, 1, 55, 1, 14], [8, 22, 2, 7, 12, 3], [6, 1, 1, 5, 5, 5]
trans = list(zip(*lamt))
[(lambda x, y, z: x*y-z)(x,y,z) for (x,y,z) in trans]

工作正常。但无法在代码中重现。

你能告诉我,有什么问题,或者如何做得更好吗?

我认为您可以简单地使用内置 map in connjunction with zip 为您完成此操作:

def task(func, *seq):
    return map(func, zip(*seq))

此函数的单个 运行 将像下面这样工作,我们将第一个元素加在一起,将第二个元素加在一起,将第三个元素加在一起:

>>> def task(func, *seq):
...     return map(func, zip(*seq))
... 
>>> lists = [[1,2,3], [4,5,6], [7,8,9], [10,11,12]]
>>> task(sum, *lists)
[22, 26, 30]

至于您的原始代码,它不起作用,因为当您执行 result.append(func([i])) 而不是 result.append(func(i))

时,您将获得的元组转换为元组列表

所以改为:

>>> def task(func, *seq):
...   result = [] 
...   transpose = list(zip(*seq))
...   for i in transpose:
...     result.append(func(i))
...   return result
... 
>>> task(sum, *lists)
[22, 26, 30]

如果您确实想应用自定义 lambda,您可以使用以下方法显式解压参数:

>>> def task(func, *seq):
...   result = [] 
...   transpose = list(zip(*seq))
...   for i in transpose:
...     result.append(func(*list(i)))
...   return result
... 
>>> task(lambda x, y, z, a: x*y + z*a, *lists)
[74, 98, 126]

请注意,您必须非常注意 lambda 接受的输入数量,否则解包可能不会正确发生并会引发错误。