对列表中的所有元素进行平方
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
但这只是我数组的最后一个数字的平方。我怎样才能让它对整个列表进行平方?
【问题讨论】:
这是作业吗?好像是这样的。 是的,我说“我被告知...”所以我认为这很明显。我也对这个问题进行了几次尝试,但无法提出要求的格式,所以我来到这里。 请谨慎使用list
和array
;这是两种不同的数据结构。
@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)
可以代替创建2
s 的列表【参考方案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。对于map
与lambda
结合的性能,请查看***.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
的解决方案,需要 lambda
s 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
【讨论】:
以上是关于对列表中的所有元素进行平方的主要内容,如果未能解决你的问题,请参考以下文章