2012-09-23 23 views
7

me han dicho atodos los elementos en una lista

Escribir una función, cuadrado (a), que lleva una matriz, una, de números y devuelve una matriz que contiene cada uno de los valores de un cuadrado.

Al principio, tuve

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

Pero esto no funciona ya que soy impresión, y no devolverlo al igual que me pidieron. así que traté

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

Pero esto sólo plazas el último número de mi matriz. ¿Cómo puedo lograr que cuadre toda la lista?

+2

Es esta tarea? Parece que sí. –

+0

sí lo es, dije "me dijeron que ...", así que pensé que era obvio. También intenté un poco el problema y no pude encontrar el formato que se me pidió, así que vine aquí. – user1692517

+1

Tenga cuidado con su uso de 'list' y' array'; esas son dos estructuras de datos diferentes. – Akavall

Respuesta

20

se puede utilizar una lista por comprensión:

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

o podría map que:

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

o puede utilizar un generador. No va a devolver una lista, pero todavía se puede iterar a través de él, y puesto que usted no tiene que asignar toda una lista nueva, es posiblemente más eficiente con el espacio que las otras opciones:

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

O que puede hacer la vieja y aburrida for -loop, aunque esto no es tan idiomática, ya que algunos programadores de Python preferirían:

def square(list): 
    ret = [] 
    for i in list: 
     ret.append(i ** 2) 
    return ret 
+0

Bueno, usted señala muchos métodos. Sin embargo, la mayoría de las soluciones establecidas se basan en la comprensión de la lista o numpy. Para el funcionamiento de 'map' en combinación con' lambda', echa un vistazo a http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

+0

¡Gracias! Usé el método de comprensión. Estaremos buscando más en ese método. – user1692517

+0

"Esto no es tan idiomático como preferirían los programadores de Python" - Estoy completamente de acuerdo, pero vale la pena señalar que hay situaciones en las que la única opción práctica es agregar a una lista. El mejor ejemplo que puedo pensar es si el generador necesita 'recordar' los números que ha devuelto previamente para no devolver duplicados o entrar en un ciclo. –

18

Utilice una lista por comprensión (este es el camino a seguir en Python puro):

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

O numpy (un módulo bien establecida):

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

En numpy, matemáticas las operaciones en matrices se ejecutan de forma predeterminada por elementos. Es por eso que puedes **2 una matriz completa allí.

Otras soluciones posibles serían map -based, pero en este caso realmente iría por la lista de comprensión. Es Pythonic :) y una solución basada en map que requiere lambda s is slower than LC.

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

uso numpy.

import numpy as np 
b = list(np.array(a)**2) 
+1

Numpy para un problema tan trivial parece excesivo. –

+1

Punto justo, pero cuando tiene la necesidad de cuadrar listas, pronto debe comenzar a hacer otras operaciones con ellos y no hay ninguna razón para reinventar la rueda. – tacaswell

+0

¿Hay alguna manera de evitar tener que usar np.array y simplemente usar array (a) ** 2? – user1936752

0

Una solución más mapa:

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

así ¿Cómo puedo hacer el cuadrado de los números 1-20 usando la función

0

anterior se puede hacer

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

que devuelve

[25, 9, 1, 4, 16] 

o, si la lista ya tiene los valores

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

que devuelve

[25, 9, 1, 4, 16] 

Nota: no querer hacer

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

como devuelve una lista en una lista:

[[25, 9, 1, 4, 16]] 
1
import numpy as np 
a = [2 ,3, 4] 
np.square(a) 
Cuestiones relacionadas