【问题标题】: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,感谢您告诉我。

标签: python arrays return


【解决方案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 结合的性能,请查看stackoverflow.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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-02
          • 1970-01-01
          • 1970-01-01
          • 2012-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多