2015-05-20 16 views
15

Tôi mới dùng python và tôi đọc một số đoạn mã từ một số nơi. Đó là việc thực hiện đếm đếm.defaultdict với giá trị mặc định 1?

Mã này là như sau:

from collections import defaultdict 
def sort_colors(A): 
    ht = {}      # a hash map 
    ht = defaultdict(lambda:0, ht) # with default value 1 
    for i in A: 
     ht[i] += 1 
    ret = [] 
    for k in [0, 1, 2]: 
     ret.extend([k]*ht[k]) 
    return ret 

Như trong hai dòng đầu tiên của func, nó

ht = {} 
ht = defaultdict(lambda:0, ht) 

Tôi không hoàn toàn rõ ràng về vấn đề này initialization.Could bạn vui lòng giúp tôi hình nó ra? và cũng có thể, chúng ta chỉ cần thay thế hai dòng sau đây?

ht = defaultdict(int) # default value 0 
+3

chừng nào bạn đang nhập khẩu từ các bộ sưu tập, có thể cũng chỉ cần sử dụng một 'Counter'. – Kevin

+2

giá trị mặc định không có 1, đó là 0. –

+2

Hãy thử' ht = defaultdict (lambda : 1) # với giá trị mặc định 1' và xóa 'ht = {}' trước đó không thực hiện được gì vì bạn thay đổi giá trị 'ht' trong dòng tiếp theo. – martineau

Trả lời

16
ht = {} 
ht = defaultdict(lambda:0, ht) 

defaultdict s khác với dict ở chỗ khi bạn cố gắng truy cập vào một thường xuyên dict với một chìa khóa mà không tồn tại, nó sẽ gây nên KeyError. Tuy nhiên,
defaultdict không gây ra lỗi: nó tạo khóa cho bạn. Với giá trị nào? Với sự trở lại của callabe bạn đã chuyển làm đối số. Trong trường hợp này, mọi khóa mới sẽ được tạo với giá trị 0 (là sự trở lại của hàm lambda đơn giản lambda:0), cũng có cùng một lợi nhuận là int(), vì vậy trong trường hợp này, sẽ không có sự khác biệt trong thay đổi chức năng mặc định thành int().

Breaking xuống dòng này chi tiết hơn: ht = defaultdict(lambda:0, ht)

Đối số đầu tiên là một chức năng, mà là một đối tượng có thể được gọi. Đây là hàm sẽ được gọi để tạo một giá trị mới cho một khóa không tồn tại. Đối số thứ hai, ht là tùy chọn và đề cập đến từ điển cơ sở mà defaultdict mới sẽ được xây dựng trên đó. Do đó, nếu ht có một số khóa và giá trị, thì defaultdict cũng sẽ có các khóa này với các giá trị tương ứng. Nếu bạn cố truy cập các khóa này, bạn sẽ nhận được các giá trị cũ. Tuy nhiên, nếu bạn không chuyển từ điển cơ sở, một nhãn hiệu mới defaultdict sẽ được tạo và do đó, tất cả các khóa mới được truy cập sẽ nhận được giá trị mặc định được trả về từ cuộc gọi.
(Trong trường hợp này, như ht là ban đầu một trống dict, sẽ không có sự khác biệt ở tất cả trong làm ht = defaultdict(lambda:0), ht = defaultdict(int) hoặc ht = defaultdict(lambda:0, ht): tất cả họ sẽ xây dựng cùng defaultdict

+0

(lambda: 0, ht) chỉ có thể gọi được bằng 0? – chancyWu

+0

Điều đó là chính xác. Tôi đã chỉnh sửa bài đăng để chia nhỏ chi tiết hơn – RafaelC

+0

Điều thú vị này là! Tôi có thể tìm hiểu thêm về các khái niệm như vậy ở đâu? –

25

Tôi nghĩ rằng bạn chỉ có thể vượt qua một lambda. hàm trả về 1

d = defaultdict(lambda:1) 
+3

điều này là chính xác. không phải là câu trả lời được chấp nhận. – jimh

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