我对python很新,并试图弄清楚如何在下面重写我的平方函数来接受列表作为参数,但我无法让它工作。我想我需要使用map或reduce等东西。有谁知道如何重写接受列表?
def square(self,x):
number_types = (int, long, float, complex)
if isinstance(x, number_types):
return x*x
else:
raise ValueError
答案 0 :(得分:1)
只需使用lambda和map
的组合 l=[1,2,3,4,5,6]
a= lambda x: x*x if type(x) == (int or float or complex) else ""
b=list(map(a,l))
print(b)
[1, 4, 9, 16, 25, 36]
答案 1 :(得分:1)
对每个元素进行平方:
def square(l):
return [pow(i, 2) for i in l]
print(square([i for i in range(10)]))
输出:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
答案 2 :(得分:1)
如果你确实需要这样的功能,请制作一个包装器:
def square2(x):
if isinstance(x, collections.abc.Sequence):
return [square(n) for n in x]
return square(x)
更改为collections.Sequence
for Python< 3.3
答案 3 :(得分:1)
这就是你想要的:
class A:
def square(self, x):
number_types = (int, long, float, complex)
xlist = x if isinstance(x, list) else [x]
for i in xlist:
if not isinstance(i, number_types):
raise ValueError
if not isinstance(x, list):
return x*x
return [i*i for i in x]
if __name__ == '__main__':
a = A()
print(a.square(2))
print(a.square([1, 2, 3, 4, 5]))
答案 4 :(得分:1)
这里最好的解决方案是使用numpy:
import numpy as np
def square(x):
x = np.asarray(x)
number_types = (int, long, float, complex)
if x.dtype in number_types:
return x*x
else:
raise ValueError
这比在列表上操作更快,并允许您使用任何类型的iterable。对代码的修改也非常小,代码非常易读,特别是与基于map
的解决方案相比时。
与标量符合预期:
>>> square(3)
9
也适用于列表,元组等
>>> square([3, 4])
array([ 9, 16])
>>> square((3, 4))
array([ 9, 16])
与其他版本的快速比较表明它更快
>>> a = lambda x: x*x if type(x) == (int or float or complex) else ""
>>> l = [0] * 100
>>> %timeit list(map(a,l))
10000 loops, best of 3: 23.5 µs per loop
>>> %timeit square(l)
100000 loops, best of 3: 6.88 µs per loop
对于较大的列表,性能领先优势会更大。