对列表中的所有元素进行平方

Posted

技术标签:

【中文标题】对列表中的所有元素进行平方【英文标题】:Squaring all elements in a list 【发布时间】:2012-09-15 08:19:27 【问题描述】:

我被告知

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

一开始我有

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

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

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

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

【问题讨论】:

这是作业吗?好像是这样的。 是的,我说“我被告知...”所以我认为这很明显。我也对这个问题进行了几次尝试,但无法提出要求的格式,所以我来到这里。 请谨慎使用listarray;这是两种不同的数据结构。 @Akavall:请注意,作业标签现已弃用,不应添加到问题中 @DavidRobinson,感谢您告诉我。 【参考方案1】:
n = int(input())

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

print(final_list)

【讨论】:

在你的代码周围添加一些文本:要么告诉我们你为什么添加这个答案(据说,没有其他人让你满意),要么在你的代码块中添加#,因为你为了简单起见。跨度> 这是不正确的。您应该对给定列表中的每个元素进行平方。这只会生成一个包含最多 n^2 的所有完美平方的列表。 Try it online!【参考方案2】:

你可以的

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]]

【讨论】:

注意:square_list.extend() 不会返回任何内容,因为这是一个就地操作。 @AChampion 你是对的,我会编辑使其更准确。看看 4 年前的自己也很有趣,哇【参考方案3】:
import numpy as np
a = [2 ,3, 4]
np.square(a)

【讨论】:

【参考方案4】:
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

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

【讨论】:

【参考方案5】:

另一种地图解决方案:

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

【讨论】:

另外,itertools.repeat(2) 可以代替创建2s 的列表【参考方案6】:

您可以使用列表推导:

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-loop,虽然这不像一些 Python 程序员喜欢的那样惯用:

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

【讨论】:

很好,你指出了很多方法。但是,大多数已建立的解决方案都基于列表理解或 numpy。对于maplambda 结合的性能,请查看***.com/questions/1247486/… 谢谢!我使用了理解方法。将更多地研究这种方法。 “这不像某些 Python 程序员所希望的那样惯用”——我完全同意,但值得指出的是,在某些情况下,唯一实用的选择是附加到列表中。我能想到的最好的例子是生成器是否需要“记住”它之前返回的数字,以免返回重复或进入循环。 对 O(1) 空间复杂度地图解决方案投了赞成票【参考方案7】:

使用列表推导式(这是纯 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 is slower than LC。

【讨论】:

【参考方案8】:

使用 numpy。

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

【讨论】:

Numpy 对于这样一个微不足道的问题似乎有点矫枉过正。 公平点,但是在您需要排列列表的地方,您很快就需要开始对它们进行其他操作,没有理由重新发明***。 有没有办法避免使用 np.array 而只使用 array(a)**2? @user1936752 不,因为没有定义标准数组上的“幂”函数。但是,它是在numpy 数组上定义的,因为它们不是真正的数组;它们是由numpy 模块创建的特殊数据类型。【参考方案9】:
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

【讨论】:

以上是关于对列表中的所有元素进行平方的主要内容,如果未能解决你的问题,请参考以下文章

根据行和列对矩阵中的所有元素进行排名

删除列表元素的几种方法

如何通过第一个元素对列表内的列表进行分组?

根据列表中的元素对列表作为值的字典进行排序

Python - 如何按每个列表中的第四个元素对列表列表进行排序? [复制]

list(列表)中的元素是否先进先出?