2012-12-08 36 views
8

Tôi có từ điển sau:chức năng lambda trong từ điển được sắp xếp danh sách hiểu

student_loan_portfolio = { 
    'loan1': {'rate': .078, 'balance': 1000, 'payment': 100, 'prepayment': 0}, 
    'loan2': {'rate': .0645, 'balance': 10, 'payment': 5, 'prepayment': 0}, 
    'loan3': {'rate': .0871, 'balance': 250, 'payment': 60, 'prepayment': 0}, 
    'loan4': {'rate': .0842, 'balance': 200, 'payment': 37, 'prepayment': 0}, 
    'loan5': {'rate': .054, 'balance': 409, 'payment': 49, 'prepayment': 0}, 
    'loan6': {'rate': .055, 'balance': 350, 'payment': 50, 'prepayment': 0} 
} 

Tôi muốn lặp qua các từ điển chứa (với các phím loan1 qua loan6) theo thứ tự phím có chứa các từ điển với mức cao nhất giá trị 'tỷ lệ' trong từ điển lồng nhau tương ứng. Đó là, tôi muốn lặp theo thứ tự loan3, loan4, loan1, loan2, loan6, loan5

Nhờ @Jame Sharp cách dễ nhất để làm điều này mà tôi biết là:

for k,v in sorted(student_loan_portfolio.items(), key=lambda (k,v): v['rate'], reverse=True): 

tôi bây giờ đọc về lambda và không thể thực sự hiểu chính xác cách thức và lý do tại sao nó hoạt động. Đầu tiên, v ['rate'] Tôi tin là trả lại giá trị của các khóa từ điển đó. Nhưng nó có vẻ như nó phải là một loại lỗi cú pháp. Tham chiếu v ['rate'] là gì và logic đằng sau cú pháp là gì?

Trên ghi chú có liên quan, tại sao, chúng ta phải chỉ định đầu vào cho hàm lambda như một bộ tuple?

Và các trường hợp sau đây khác nhau như thế nào?

#1 

>>>f = lambda x,y,z:x + y + z 
>>>f(1,2,3) 

#6 

>>>f = lambda (x,y,z): x + y + z 
>>>f(1,2,3) 

Traceback (most recent call last): 
    File "<pyshell#48>", line 1, in <module> 
    f(1,2,3) 
TypeError: <lambda>() takes exactly 1 argument (3 given) 

Cảm ơn bạn đã làm rõ.

+3

tùy chọn thứ hai mong đợi đầu vào được đóng gói có 3 giá trị? 'f ((1,2,3))' –

Trả lời

5

Phương thức items() trên student_loan_portfolio.items() trả về danh sách các bộ khóa/giá trị. Vì vậy, nó trả về một cái gì đó như [ ('loan1', dictOfLoan1), ('loan2', dictOfLoan2), ...]. Lambda chấp nhận tuple này làm đối số và đọc mục "rate" từ giá trị dict (tức là nó đọc dictOfLoan1['rate'], dictOfLoan2['rate'], v.v.).

Bạn có thể đạt được hiệu ứng tương tự bằng cách sử dụng, thay vì lambda bạn có, lambda item: item[1]['rate']. item là một tuple (key, value), vì vậy item[1] là giá trị.

Sự khác biệt giữa hai ví dụ lambda của bạn là trường hợp đầu tiên chấp nhận ba đối số, trong khi thứ hai chấp nhận một đối số duy nhất là một bộ ba phần tử. Khả năng xác định một hàm nhận các bộ dữ liệu là các đối số nhưng đưa nội dung của chúng vào các biến cục bộ riêng biệt là một quirk của Python đã bị loại bỏ trong Python 3 (xem PEP 3113).

+0

Ok cảm ơn @BrenBarn. Tôi đã làm một số thử nghiệm nhiều hơn và do đó lý do v ['tỷ lệ'] không phải là một lỗi cú pháp là bởi vì v là một từ điển, phải không? – cdelsola

+0

@ user1816858: Vâng, về cơ bản. Bạn có một từ điển có giá trị cũng là từ điển. (Nếu nó không phải là một từ điển, nó vẫn không phải là lỗi * cú pháp *, nhưng bạn sẽ gặp lỗi nếu nó không hỗ trợ truy cập mục bằng cách sử dụng '[]'.) – BrenBarn

8

lambda (k,v): v['rate'] là một hàm lấy một đối số duy nhất (một bộ 2 bước) và trả về khóa 'rate' của mục nhập thứ hai trong bộ tuple. Nó tương đương với lambda t: t[1]['rate']

lambda x,y,z:x + y + z là hàm có 3 giá trị và trả về tổng của chúng.

lambda (x,y,z): x + y + z là hàm lấy 1 giá trị (3 bộ) và trả về tổng các phần tử của nó.

Các vấn đề liên quan