是否有替代方法来获得所需的输出?现在,通过调用numpy.vectorize
函数导入numpy包,它可以正常工作。
我不想导入包,我想通过编写原始python代码来实现此目的。有什么建议吗?
def comp(a, b):
if a < b:
return a+b
else:
return a-b
import numpy as np
b = np.vectorize(comp)
c = b([1, 2, 3], 2)
c
应该获得类似[3, 0, 1]
答案 0 :(得分:4)
只需使用列表理解:
[comp(x, 2) for x in [1,2,3]]
或在两个列表中map
使用该功能:
list(map(comp, [1,2,3], [2,2,2]))
或使用functools.partial
并将其结果映射到列表中:
import functools
list(map(functools.partial(comp, b=2), [1,2,3]))
答案 1 :(得分:2)
或者,使用itertools
在[2]
之外创建循环迭代器:
import itertools
list(map(comp, [1, 2, 3], itertools.cycle([2])))
或者,不使用itertools
但基本相同的想法(请注意,对于range(n)
也可以使用任何n >= 3
,您将得到相同的结果):
list(map(comp, [1, 2, 3], (2 for _ in range(3))))
您也可以拥有自己的装饰器。 例如,如果您愿意始终提供 1D 可迭代对象并总是循环最短的对象,则可以使用以下(原始但实用的)代码:
import itertools
def iterize(func):
def wrapper(*args, **kwargs):
max_len = max(len(arg) for arg in args)
return list(map(
func,
*(arg if len(arg) == max_len else itertools.cycle(arg)
for arg in args),
**kwargs))
return wrapper
可以这样使用:
@iterize
def comp(a, b):
return a + (b if a < b else -b)
comp([1, 2, 3], [2])
# [3, 0, 1]
comp(range(10), range(5))
# [0, 0, 0, 0, 0, 5, 5, 5, 5, 5]
当然可以设想不同的方式来处理参数,处理不同的长度等。