Squaring all elements in a list
Asked Answered
F

9

21

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?

Fleisher answered 23/9, 2012 at 19:17 Comment(4)
Is this homework? Seems like it is.Cotyledon
yes it is, I said "I am told to ..." so I thought it was obvious. I took a few attempts on the problem also and could not come up with the format that was asked for so I came here.Fleisher
Please be careful with your use of list and array; those are two different data structures.Extramural
@Akavall: note that the homework tag is now deprecated and should not be added to questionsCentra
C
43

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
Canakin answered 23/9, 2012 at 19:22 Comment(4)
Good that you point out a lot of methods. However, most established solutions are based on list comprehension or numpy. For performance of map in combination with lambda, have a look at #1247986Kanchenjunga
Thank you! I used the comprehension method. Will be looking more into that method.Fleisher
"This is not as idiomatic as some Python programmers would prefer" - I completely agree, but it's worth pointing out that there are situations in which the only practical option is to append to a list. The best example I can think of is if the generator needs to 'remember' the numbers it has previously returned so as not to return duplicates or get into a cycle.Liliuokalani
up voted for the O(1) space complexity map solutionKnar
K
38

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.

Kanchenjunga answered 23/9, 2012 at 19:19 Comment(0)
E
9
import numpy as np
a = [2 ,3, 4]
np.square(a)
Emblematize answered 9/11, 2017 at 20:43 Comment(0)
J
3

Use numpy.

import numpy as np
b = list(np.array(a)**2)
Joyless answered 23/9, 2012 at 19:24 Comment(4)
Numpy for such a trivial problem seems like overkill.Canakin
Fair point, but where you have the need to square lists, you soon need to start doing other operations with them and there is no reason re-invent the wheel.Joyless
Is there a way to avoid having to use np.array and just use array(a)**2?Isabeau
@Isabeau No, because the "to the power of" function on standard arrays isn't defined. However, it's defined on numpy arrays, because they aren't really arrays; they are a special data type created by the numpy module.Institutional
E
1
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares
Exceptional answered 23/9, 2012 at 19:20 Comment(0)
T
0

One more map solution:

def square(a):
    return map(pow, a, [2]*len(a))
Toluca answered 20/10, 2012 at 19:31 Comment(1)
Also, itertools.repeat(2) would work instead of creating a list of 2sBezanson
H
0
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

Hodess answered 15/12, 2015 at 5:51 Comment(0)
A
0

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]]
Achromatism answered 8/10, 2016 at 16:6 Comment(2)
Note: square_list.extend() does not return anything as this is an in place operation.Bezanson
@Bezanson you are correct, i'll edit to make it more accurate. Also its funny to look at myself from 4 years ago talk wowAchromatism
C
0

Apparently you can just "square" a numpy array:

import numpy
a = numpy.array([2,3,4])
squares = a**2
Cutcliffe answered 10/7 at 12:1 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.