2012-09-23 20 views
7

mi è stato detto aquadratura tutti gli elementi in una lista

Scrivi una funzione, quadrato (a), che prende un array, una, di numeri e restituisce un array contenente ciascuno dei valori di un quadrato.

In un primo momento, ho avuto

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

Ma questo non funziona visto che sono la stampa, e non tornare, come mi è stato chiesto. Così ho provato

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

Ma questo solo piazze l'ultimo numero del mio array. Come posso farlo quadrare l'intera lista?

+2

È questo compito? Sembra che lo sia. –

+0

sì, ho detto "mi è stato detto di ..." quindi ho pensato che fosse ovvio. Ho fatto alcuni tentativi anche sul problema e non sono riuscito a trovare il formato richiesto, quindi sono venuto qui. – user1692517

+1

Si prega di fare attenzione con l'uso di 'list' e' array'; quelle sono due diverse strutture di dati. – Akavall

risposta

20

si potrebbe usare una lista di comprensione:

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

Oppure si potrebbe map esso:

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

Oppure si potrebbe usare un generatore. Non restituirà un elenco, ma è ancora possibile scorrere attraverso di essa, e dal momento che non c'è bisogno di destinare un intero nuovo elenco, è forse più efficiente dello spazio rispetto alle altre opzioni:

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

Or si può fare il vecchio noioso for -loop, anche se questo non è così idiomatica come alcuni programmatori Python preferirebbero:

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

Bene, ti fai notare molti metodi. Tuttavia, le soluzioni più consolidate si basano sulla comprensione delle liste o sul numpy. Per prestazioni di 'map' in combinazione con' lambda', dai un'occhiata a http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

+0

Grazie! Ho usato il metodo di comprensione. Guarderemo più a questo metodo. – user1692517

+0

"Questo non è così idioma come preferirebbero alcuni programmatori Python" - Sono completamente d'accordo, ma vale la pena sottolineare che ci sono situazioni in cui l'unica opzione pratica è quella di aggiungere una lista. Il miglior esempio che posso pensare è se il generatore ha bisogno di "ricordare" i numeri che ha precedentemente restituito in modo da non restituire duplicati o entrare in un ciclo. –

18

utilizzare una lista di comprensione (questo è il modo di andare in puro Python):

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

O numpy (un modulo ben consolidata):

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

In numpy, matematica le operazioni sugli array sono, per impostazione predefinita, eseguite in base agli elementi. Ecco perché puoi **2 un intero array lì.

Altre soluzioni possibili sarebbero map -based, ma in questo caso mi piacerebbe davvero la comprensione delle liste. È Pythonic :) e una soluzione basata su map che richiede lambda s is slower than LC.

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

Usa NumPy.più

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

Il numpy per un problema così insignificante sembra eccessivo. –

+1

Punto giusto, ma dove hai bisogno di quadrare le liste, presto devi iniziare a fare altre operazioni con loro e non c'è ragione di reinventare la ruota. – tacaswell

+0

C'è un modo per evitare di dover usare np.array e basta usare array (a) ** 2? – user1936752

0

Una soluzione mappa:

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 

così come potrei fare il quadrato dei numeri 1-20 utilizzando la funzione di

0

sopra di voi può fare

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

che restituisce

[25, 9, 1, 4, 16] 

o, se la lista ha già valori

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

che restituisce

[25, 9, 1, 4, 16] 

Nota: non si vuole fare

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

come restituisce una lista in una lista:

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