19

我被告知

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

起初,我有

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

但这不起作用,因为我正在打印,并且没有像我被问到的那样返回。所以我尝试了

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

但这只会平方我数组的最后一个数字。我怎样才能让它平方整个列表?

4

9 回答 9

40

您可以使用列表理解:

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

或者你可以map

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

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

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

或者你可以做无聊的老for循环,虽然这不像一些 Python 程序员喜欢的那样惯用:

def square(list):
    ret = []
    for i in list:
        ret.append(i ** 2)
    return ret
于 2012-09-23T19:22:35.900 回答
32

使用列表推导(这是纯 Python 的方式):

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

或者numpy(一个成熟的模块):

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

numpy中,默认情况下,数组上的数学运算是按元素执行的。这就是为什么你可以**2在那里放置一个完整的数组。

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

于 2012-09-23T19:19:42.620 回答
8
import numpy as np
a = [2 ,3, 4]
np.square(a)
于 2017-11-09T20:43:02.903 回答
2

使用 numpy。

import numpy as np
b = list(np.array(a)**2)
于 2012-09-23T19:24:15.107 回答
1
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares
于 2012-09-23T19:20:31.217 回答
0

另一种地图解决方案:

def square(a):
    return map(pow, a, [2]*len(a))
于 2012-10-20T19:31:17.580 回答
0

你可以做

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

返回

[25, 9, 1, 4, 16]  

或者,如果列表已经有值

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

这会产生一个如下所示的列表:

[25, 9, 1, 4, 16]  

注意:你不想做

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

因为它实际上是在原始列表中添加了一个列表,例如:

[_original_, _list_, _data_, [25, 9, 1, 4, 16]]
于 2016-10-08T16:06:55.780 回答
0
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

那么我将如何使用上述函数计算 1-20 的数字平方

于 2015-12-15T05:51:38.453 回答
-1
n = int(input())

final_list = [n**2 for n in range(1, n+1)]

print(final_list)
于 2021-05-19T08:02:49.170 回答