web-dev-qa-db-fra.com

Squaring tous les éléments d'une liste

On me dit de 

Ecrivez une fonction, square (a), qui prend un tableau, a, de nombres et retourne un tableau contenant chacune des valeurs d'un carré.

Au début, j'avais

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

Mais cela ne fonctionne pas puisque je suis en train d’imprimer et que je ne reviens pas comme on me l’avait demandé…

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

Mais cela ne fait que quadriller le dernier numéro de mon tableau. Comment puis-je le faire cocher toute la liste?

8
user1692517

Vous pouvez utiliser une compréhension de liste:

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

Ou vous pourriez map le:

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

Ou vous pouvez utiliser un générateur. Il ne renverra pas de liste, mais vous pouvez quand même le parcourir et, comme vous n'avez pas à allouer une nouvelle liste complète, il est peut-être plus économe en espace que les autres options:

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

Ou vous pouvez faire la vieille boucle for- ennuyeuse, bien que ce ne soit pas aussi idiomatique que certains programmeurs Python préféreraient:

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

Utiliser une liste de compréhension (c'est le chemin à suivre en pur Python):

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

Ou numpy (un module bien établi):

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

Dans numpy, les opérations mathématiques sur les tableaux sont exécutées élément par élément. C'est pourquoi vous pouvez **2 un tableau entier ici.

D'autres solutions possibles seraient basées sur map-, mais dans ce cas, je choisirais vraiment la liste de compréhension. C'est Pythonic :) et une solution basée sur map qui nécessite lambdas est plus lente que LC

23
Jan-Philip Gehrcke
import numpy as np
a = [2 ,3, 4]
np.square(a)
3
user3503711

Utilisez numpy.

import numpy as np
b = list(np.array(a)**2)
2
tacaswell
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares
1
Curious
def square(a):
    squares = []
    for i in a:
        squares.append(i**2)
    return squares

alors comment ferais-je le carré de nombres de 1 à 20 en utilisant la fonction ci-dessus

0
Abrham Yep

tu peux faire 

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

qui retourne 

[25, 9, 1, 4, 16]  

ou, si la liste a déjà des valeurs 

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

qui retourne 

[25, 9, 1, 4, 16]  

Note : vous ne voulez pas faire 

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

comme il retourne une liste dans une liste: 

[[25, 9, 1, 4, 16]]
0
9 Guy

Une solution de carte supplémentaire:

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