2016-07-20 17 views
5

Khi làm việc với Python 3 từ điển, tôi cứ phải làm một cái gì đó như thế này:Làm cách nào để tăng giá trị của phần tử từ điển một cách nguyên bản?

d=dict() 
if 'k' in d: 
    d['k']+=1 
else: 
    d['k']=0 

tôi dường như nhớ có trở thành một cách tự nhiên để làm được điều này, nhưng đang tìm kiếm thông qua các tài liệu và không thể tìm thấy nó . Bạn có biết cái này là cái gì không?

Trả lời

12

Đây là trường hợp sử dụng cho collections.defaultdict, tại đây chỉ cần sử dụng int có thể gọi cho nhà máy mặc định.

>>> from collections import defaultdict 
>>> d = defaultdict(int) 
>>> d 
defaultdict(<class 'int'>, {}) 
>>> d['k'] +=1 
>>> d 
defaultdict(<class 'int'>, {'k': 1}) 

A defaultdict được định cấu hình để tạo mục bất kỳ khi nào một phím bị thiếu được tìm kiếm. Bạn cung cấp nó với một cuộc gọi (ở đây int()) mà nó sử dụng để tạo ra một giá trị mặc định bất cứ khi nào tra cứu với __getitem__ được chuyển qua một khóa không tồn tại. Điều này có thể gọi được lưu trữ trong một thuộc tính dụ được gọi là default_factory.

Nếu bạn không cung cấp default_factory, bạn sẽ nhận được KeyError như thường lệ đối với các phím bị thiếu.

Sau đó, giả sử bạn muốn có một giá trị mặc định khác nhau, có lẽ 1 thay vì 0. Bạn chỉ đơn giản là sẽ phải vượt qua một callable cung cấp mong muốn giá trị bắt đầu của bạn, trong trường hợp này rất trivially

>>> d = defaultdict(lambda: 1) 

này có thể rõ ràng cũng là bất kỳ chức năng được đặt tên thường xuyên nào.


Nó đáng chú ý tuy nhiên nếu trong trường hợp của bạn, bạn đang cố gắng để chỉ cần sử dụng một từ điển để lưu trữ số lượng các giá trị đặc biệt, một collections.Counter là phù hợp hơn cho công việc.

>>> from collections import Counter 
>>> Counter('kangaroo') 
Counter({'a': 2, 'o': 2, 'n': 1, 'r': 1, 'k': 1, 'g': 1}) 
0

Hãy lưu ý rằng bạn luôn có thể loại bỏ sự lộn xộn từ if stamemt bằng cách sử dụng nó trong một biểu thức:

d['k'] = d['k'] + 1 if 'k' in d else 0 
Các vấn đề liên quan