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

时间:2015-04-18 21:59:57

标签: python function matrix arguments

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]

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

你能告诉我,有什么不对,或者如何更好地做到这一点?

1 个答案:

答案 0 :(得分:1)

我认为您只需使用与map连接的内置zip即可为您执行此操作:

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

此函数的单次运行将如下所示,其中我们将第一个元素汇总,第二个元素togather,以及第三个元素togather:

>>> 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采用的输入数量,否则解包可能不会正确发生并且会引发错误。