mặc định
"Từ điển tiêu chuẩn bao gồm phương thức setdefault () để truy xuất giá trị và thiết lập mặc định nếu giá trị không tồn tại. Ngược lại, hãy defaultdict
để người gọi chỉ định mặc định (giá trị được trả về) ở phía trước khi container được khởi tạo."
như được định nghĩa bởi Doug Hellmann trong Thư viện tiêu chuẩn Python theo ví dụ
Cách sử dụng defaultdict
Nhập defaultdict
>>> from collections import defaultdict
Khởi tạo defaultdict
Khởi tạo nó bằng cách vượt qua
có thể gọi là đối số đầu tiên của nó (bắt buộc)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
** kwargs là đối số thứ hai của nó (tùy chọn)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
hoặc là
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
Nó làm việc như thế nào
Là một lớp con của từ điển chuẩn, nó có thể thực hiện tất cả các chức năng tương tự.
Nhưng trong trường hợp chuyển một khóa không xác định, nó sẽ trả về giá trị mặc định thay vì lỗi. Ví dụ:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
Trong trường hợp bạn muốn thay đổi giá trị mặc định, ghi đè default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
hoặc là
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
Ví dụ trong câu hỏi
ví dụ 1
Vì int đã được truyền dưới dạng default_factory, bất kỳ khóa không xác định nào sẽ trả về 0 theo mặc định.
Bây giờ khi chuỗi được truyền trong vòng lặp, nó sẽ tăng số lượng các bảng chữ cái trong d.
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
Ví dụ 2
Vì một danh sách đã được thông qua dưới dạng default_factory, mọi khóa không xác định (không tồn tại) sẽ trả về [] (tức là danh sách) theo mặc định.
Bây giờ khi danh sách các bộ dữ liệu được truyền trong vòng lặp, nó sẽ nối thêm giá trị trong d [color]
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
default_factory = None
sau khi bạn hoàn thành việc điền vào defaultdict. Xem câu hỏi này .