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]
工作正常。但无法在代码中重现。
你能告诉我,有什么不对,或者如何更好地做到这一点?
答案 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采用的输入数量,否则解包可能不会正确发生并且会引发错误。