Squaring all elements in a list

Question:

I am told to

Write a function, square(a), that takes an array, a, of numbers and returns an array containing each of the values of a squared.

At first, I had

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

But this does not work since I’m printing, and not returning like I was asked.
So I tried

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

But this only squares the last number of my array. How can I get it to square the whole list?

Asked By: user1692517

||

Answers:

Use a list comprehension (this is the way to go in pure Python):

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

Or numpy (a well-established module):

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

In numpy, math operations on arrays are, by default, executed element-wise. That’s why you can **2 an entire array there.

Other possible solutions would be map-based, but in this case I’d really go for the list comprehension. It’s Pythonic 🙂 and a map-based solution that requires lambdas is slower than LC.

def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares
Answered By: Curious

You could use a list comprehension:

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

Or you could map it:

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

Or you could use a generator. It won’t return a list, but you can still iterate through it, and since you don’t have to allocate an entire new list, it is possibly more space-efficient than the other options:

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

Or you can do the boring old for-loop, though this is not as idiomatic as some Python programmers would prefer:

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

Use numpy.

import numpy as np
b = list(np.array(a)**2)
Answered By: tacaswell

One more map solution:

def square(a):
    return map(pow, a, [2]*len(a))
Answered By: hendrik
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

so how would i do the square of numbers from 1-20 using the above function

Answered By: Abrham Yep

you can do

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

which returns

[25, 9, 1, 4, 16]  

or, if the list already has values

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

which results in a list that looks like:

[25, 9, 1, 4, 16]  

Note: you don’t want to do

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

as it literally adds a list to the original list, such as:

[_original_, _list_, _data_, [25, 9, 1, 4, 16]]
Answered By: 9 Guy
import numpy as np
a = [2 ,3, 4]
np.square(a)
Answered By: user3503711
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.