如何重写此python函数以接受列表作为参数?

时间:2017-07-15 16:02:31

标签: python reduce

我对python很新,并试图弄清楚如何在下面重写我的平方函数来接受列表作为参数,但我无法让它工作。我想我需要使用map或reduce等东西。有谁知道如何重写接受列表?

def square(self,x):
    number_types = (int, long, float, complex)
    if isinstance(x, number_types):
        return x*x
    else:
        raise ValueError

5 个答案:

答案 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

这里最好的解决方案是使用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

对于较大的列表,性能领先优势会更大。