2012-09-23 24 views
7

Powiedziano mi doKwadratura wszystkie elementy na liście

Napisz funkcję, kwadrat (a), że pobiera tablicę, a, liczb i zwraca tablicę zawierającą każdej wartości a do kwadratu.

Początkowo miałem

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

Ale to nie zadziała, ponieważ jestem drukowania, a nie powrót jakbym zapytał. Więc próbowałem

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

ale to tylko kwadraty ostatni numer mojej tablicy. Jak mogę go ustawić na całej liście?

+2

Czy to zadanie domowe? Wydaje się, że tak jest. –

+0

Tak, jest, powiedziałem "Powiedziano mi ...", więc pomyślałem, że to oczywiste. Podjąłem kilka prób rozwiązania problemu i nie mogłem wymyślić formatu, o który poproszono, więc przyszedłem tutaj. – user1692517

+1

Uważaj przy użyciu 'list' i' array'; to są dwie różne struktury danych. – Akavall

Odpowiedz

20

Można użyć wyrażeń listowych:

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

Albo można go map:

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

Albo można użyć generatora. To nie zwróci listę, ale nadal można iterację nim, a ponieważ nie trzeba przeznaczyć całą nową listę, to prawdopodobnie bardziej efektywne niż przestrzeń innych opcji:

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

Or można zrobić nudny stary for -loop, choć nie jest to tak idiomatyczne jak niektórzy programiści Python woleliby:

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

Dobrze, że wskazuje się na wiele metod. Jednak najbardziej znane rozwiązania opierają się na zrozumieniu listy lub numpy. Aby uzyskać "mapę" w połączeniu z 'lambda', spójrz na http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

+0

Dziękujemy! Użyłem metody rozumienia. Będzie szukał więcej w tej metodzie. – user1692517

+0

"To nie jest tak idiotyczne, jak niektórzy programiści wolą" - całkowicie się zgadzam, ale warto podkreślić, że są sytuacje, w których jedyną praktyczną opcją jest dołączenie do listy. Najlepszym przykładem, jaki mogę sobie wyobrazić, jest to, że generator musi "zapamiętać" numery, które wcześniej zwrócił, aby nie zwracać duplikatów lub nie wchodzić w cykl. –

18

Użyj listowych (jest to droga w czystym Pythonie):

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

Albo numpy (ugruntowane moduł):

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

W numpy, matematyka operacje na tablicach są domyślnie wykonywane w sposób elementarny. Dlatego możesz tam całą tablicę. **2

Inne możliwe rozwiązania byłyby oparte na map, ale w tym przypadku naprawdę sprawdziłbym listę. To Pythonic :) i rozwiązanie oparte na map, które wymaga lambda s is slower than LC.

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

Używaj numpy.

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

Numpy za taki trywialny problem wydaje się przesadą. –

+1

Godziwej punktacji, ale tam, gdzie trzeba mieć kwadratowe listy, wkrótce trzeba zacząć robić inne operacje z nimi i nie ma powodu ponownie wymyślić koła. – tacaswell

+0

Czy istnieje sposób, aby uniknąć konieczności użycia np.array i po prostu użyć tablicy (a) ** 2? – user1936752

0

Jeszcze jedna mapa rozwiązanie:

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 

tak jak zrobiłbym kwadratu liczb od 1-20 stosując powyższą funkcję

0

można zrobić

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

, która zwraca

[25, 9, 1, 4, 16] 

lub, jeśli lista ma już wartości

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

która zwraca

[25, 9, 1, 4, 16] 

Uwaga: nie chcesz zrobić

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

jako zwraca listę na liście:

[[25, 9, 1, 4, 16]] 
Powiązane problemy