2016-12-03 26 views
8

Hãy xem xét một bộ đếm cơ bản khởi tạo từ một ánh xạ:Python - Tạo Counter() từ bản đồ, không nguyên giá trị

dict_1 = {'a': 1, 'b': 2, 'c': 3} 
count_1 = Counter(dict_1) 
print count_1 

>>> Counter({'c': 3, 'b': 2, 'a': 1}) 

Tất cả những gì có ý nghĩa. Nhưng Counter cũng cho phép tôi khởi tạo từ một từ điển không có số nguyên như cả khóa và giá trị. Ví dụ:

dict_2 = {'a': 'apple', 'b': 'banana', 'c': 'cheese'} 
count_2 = Counter(dict_2) 
print count_2 

>>> Counter({'c': 'cheese', 'b': 'banana', 'a': 'apple'}) 

Mã được viết ở trên là Python 2.7, nhưng tôi cũng đã thử nghiệm trên Python 3.5 và có cùng kết quả. Điều này dường như vi phạm quy tắc cơ bản nhất của bộ đếm, trong đó "các phần tử được lưu trữ dưới dạng khóa từ điển và số lượng của chúng được lưu trữ dưới dạng giá trị từ điển". Truy cập có cho phép các giá trị không phải là số nguyên không? Không nên nó ném một lỗi hay cái gì đó? Điều gì giải thích hành vi này?

Trả lời

8

Không có hạn chế đối với các giá trị của một đối tượng truy cập và điều này được nêu rõ trong tài liệu:

Lớp Counter chính nó là một lớp con từ điển không có giới hạn trên khóa và giá trị của nó. Các giá trị là được dự định là các số đại diện cho số lượng, nhưng bạn có thể lưu trữ mọi thứ trong trường giá trị.

[tôi nhấn mạnh]

Các hành vi của một số các Counter phương pháp cũng được mô tả trong một trường hợp chung ví dụ .:

Phương pháp most_common() chỉ đòi hỏi rằng các giá trị được orderable.

>>> count_2.most_common() 
[('c', 'cheese'), ('b', 'banana'), ('a', 'apple')] 
>>> count_2.most_common(2) 
[('c', 'cheese'), ('b', 'banana')] 

Vì vậy, người ta có thể dễ dàng chạy vào vấn đề bằng Python 3 nếu bạn có các loại unorderable như các giá trị trong đối tượng truy cập:

>>> count_2['d'] = 2 
>>> count_2 
Counter({'c': 'cheese', 'a': 'apple', 'b': 'banana', 'd': 2}) 
>>> count_2.most_common() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "c:\Python34\lib\collections\__init__.py", line 492, in most_common 
    return sorted(self.items(), key=_itemgetter(1), reverse=True) 
TypeError: unorderable types: str() < int() 

Do đó, bạn thường sẽ muốn giữ lại các giá trị như số lượng đối tượng thực tế và sử dụng từ điển vanilla khi giá trị được dự định là các loại không phải số hoặc không đúng số nguyên.

+0

Cảm ơn! Điều này rất hữu ích. – GHH

+0

@GHH Bạn có thể xem xét chấp nhận câu trả lời nếu nó giúp –

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