关于python:对列表中的所有元素进行平方

Squaring all elements in a list

我被告知

编写一个函数square(a),该函数接受一个数字数组a,然后返回一个包含每个平方值的数组。

起初,我有

1
2
def square(a):
    for i in a: print i**2

但是,由于我正在打印,因此无法正常工作,并且无法像我被要求的那样返回。
所以我尝试了

1
2
    def square(a):
        for i in a: return i**2

但这只能平方数组的最后一个数。 我如何才能使整个列表平方?


您可以使用列表理解:

1
2
def square(list):
    return [i ** 2 for i in list]

或者您可以map

1
2
def square(list):
    return map(lambda x: x ** 2, list)

或者,您可以使用发电机。它不会返回列表,但是您仍然可以遍历列表,并且由于不必分配整个新列表,因此它可能比其他选项更节省空间:

1
2
3
def square(list):
    for i in list:
        yield i ** 2

或者,您也可以执行无聊的旧版for循环,尽管这并不像某些Python程序员所希望的那样习惯:

1
2
3
4
5
def square(list):
    ret = []
    for i in list:
        ret.append(i ** 2)
    return ret


使用列表推导(这是在纯Python中使用的方法):

1
2
3
>>> l = [1, 2, 3, 4]
>>> [i**2 for i in l]
[1, 4, 9, 16]

或numpy(一个完善的模块):

1
2
>>> numpy.array([1, 2, 3, 4])**2
array([ 1,  4,  9, 16])

numpy中,默认情况下,对数组的数学运算是逐元素执行的。这就是为什么您可以在其中**2整个数组的原因。

其他可能的解决方案是基于map的,但是在这种情况下,我真的会去进行列表理解。它是Pythonic :),并且需要lambda的基于map的解决方案比LC慢。


1
2
3
import numpy as np
a = [2 ,3, 4]
np.square(a)

使用numpy。

1
2
import numpy as np
b = list(np.array(a)**2)


1
2
3
4
5
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

你可以做

1
square_list =[i**2 for i in start_list]

哪个返回

1
[25, 9, 1, 4, 16]

或者,如果列表已经有值

1
square_list.extend([i**2 for i in start_list])

哪个返回

1
[25, 9, 1, 4, 16]

注意:您不想做

1
square_list.append([i**2 for i in start_list])

因为它返回列表中的列表:

1
[[25, 9, 1, 4, 16]]

1
2
3
4
5
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

所以我将如何使用上述功能对1-20的数字进行平方运算


另一种地图解决方案:

1
2
def square(a):
    return map(pow, a, [2]*len(a))

1
2
3
4
5
from array import *

array('i', [5, 6, 4])
print(*list(map(pow, vals, [2] * len(vals))), sep='\
'
)