2012-09-23 52 views
7

Tôi được yêu cầuThu hẹp tất cả các phần tử trong danh sách

Viết hàm, hình vuông (a), lấy một mảng, một số và trả về một mảng chứa mỗi giá trị bình phương.

Lúc đầu, tôi đã có

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

Nhưng điều này không làm việc kể từ khi tôi in ấn, và không trở về như mình đang hỏi. Vì vậy, tôi đã thử

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

Nhưng điều này chỉ bình phương số cuối cùng của mảng của tôi. Làm thế nào tôi có thể làm cho nó vuông toàn bộ danh sách?

+2

Đây có phải là bài tập về nhà không? Có vẻ như vậy. –

+0

vâng, tôi nói "Tôi đã nói với ..." vì vậy tôi nghĩ điều đó là hiển nhiên. Tôi đã có một vài nỗ lực về vấn đề này và không thể đưa ra định dạng đã được yêu cầu vì vậy tôi đã đến đây. – user1692517

+1

Hãy cẩn thận với việc bạn sử dụng 'danh sách' và' mảng'; đó là hai cấu trúc dữ liệu khác nhau. – Akavall

Trả lời

20

Bạn có thể sử dụng một danh sách hiểu:

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

Hoặc bạn có thể map nó:

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

Hoặc bạn có thể sử dụng một máy phát điện. Nó sẽ không trả về một danh sách, nhưng bạn vẫn có thể lặp qua nó, và kể từ khi bạn không cần phải phân bổ toàn bộ danh sách mới, nó có thể là nhiều không gian hiệu quả hơn so với các tùy chọn khác:

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

Hoặc bạn có thể làm nhàm chán cũ for -loop, mặc dù điều này không phải là thành ngữ như một số lập trình viên Python muốn:

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

Tốt là bạn chỉ ra rất nhiều phương pháp. Tuy nhiên, hầu hết các giải pháp được thiết lập dựa trên danh sách hiểu hoặc numpy. Để thực hiện 'map' kết hợp với' lambda', hãy xem http://stackoverflow.com/questions/1247486/python-list-comprehension-vs-map –

+0

Cảm ơn bạn! Tôi đã sử dụng phương pháp hiểu. Sẽ được tìm kiếm nhiều hơn vào phương pháp đó. – user1692517

+0

"Đây không phải là thành ngữ như một số lập trình viên Python sẽ thích" - Tôi hoàn toàn đồng ý, nhưng nó có giá trị chỉ ra rằng có những tình huống trong đó lựa chọn thực tế duy nhất là để thêm vào một danh sách. Ví dụ tốt nhất tôi có thể nghĩ là nếu máy phát điện cần phải 'nhớ' những con số trước đây nó đã trả lại để không trả về các bản sao hoặc đi vào chu kỳ. –

18

Sử dụng một danh sách hiểu biết (đây là con đường để đi trong tinh khiết Python):

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

Hoặc numpy (một module cũng như thành lập):

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

Trong numpy, toán các hoạt động trên các mảng được, theo mặc định, được thực thi theo nguyên tố. Đó là lý do tại sao bạn có thể **2 toàn bộ mảng ở đó.

Các giải pháp có thể khác sẽ là map, nhưng trong trường hợp này, tôi thực sự sẽ tìm hiểu danh sách. Đó là Pythonic :) và giải pháp dựa trên map yêu cầu lambda s is slower than LC.

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

Sử dụng numPy.giải pháp bản đồ

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

Numpy cho một vấn đề tầm thường như vậy có vẻ như quá mức cần thiết. –

+1

Điểm công bằng, nhưng khi bạn cần danh sách hình vuông, bạn sẽ sớm bắt đầu thực hiện các hoạt động khác với họ và không có lý do gì để phát minh lại bánh xe. – tacaswell

+0

Có cách nào để tránh phải sử dụng np.array và chỉ sử dụng mảng (a) ** 2? – user1936752

0

Một hơn:

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 

vậy làm thế nào tôi sẽ làm gì với bình phương của số 1-20 sử dụng chức năng trên

0

bạn có thể làm

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

trả về

[25, 9, 1, 4, 16] 

hoặc, nếu danh sách đã có giá trị

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

trả về

[25, 9, 1, 4, 16] 

Note: bạn không muốn làm

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

như nó trả về một danh sách trong một danh sách:

[[25, 9, 1, 4, 16]] 
Các vấn đề liên quan