2015-05-02 21 views
6

Để tăng một mục duy nhất trong collections.Counter, bạn phải thêm nó vào danh sách để sử dụng Counter.update.Lớp truy cập Python: thêm hoặc tăng mục đơn

c = Counter() 

for item in something: 
    for property in properties_of_interest: 
     if item.has_some_property: # pseudocode: more complex logic here 
      c.update([item.property]) 
     elif item.has_some_other_property: 
      c.update([item.other_property]) 
     # elif... etc 

Một set sử dụng .update để thêm nhiều mặt hàng, và add để thêm một duy nhất. Tại sao không Counter hoạt động theo cùng một cách? Tôi có thể làm cho nó hoạt động tương tự (tức là loại bỏ việc phải đặt tài sản trong danh sách)? Hãy tưởng tượng một trường hợp bạn có một số đối tượng không xác định và bạn đang thử nhiều thứ khác nhau một cách nhanh chóng để tìm hiểu một số điều sơ bộ về chúng: hiệu suất và tỷ lệ không quan trọng, và hiểu sẽ làm cho cộng và trừ thời gian logic -trọng lượng.

+0

Vì vậy, có gì sai với mã của bạn và 'Counter.update'? – Kasramvd

+0

Tôi phải dán nó vào một danh sách giả mạo. Nó không phải là một việc lớn; Tôi chỉ tự hỏi nếu có một ý nghĩ đằng sau không có 'add'. – bahmait

+0

Phương thức 'update' chấp nhận đối số aas có thể lặp lại và lặp lại được mong đợi là một chuỗi các phần tử, không phải là một chuỗi các cặp (khóa, giá trị). – Kasramvd

Trả lời

7

Vâng, bạn không thực sự cần phải sử dụng phương pháp Counter để đếm, phải không? Có một toán tử += cho điều đó, cũng hoạt động cùng với Counter.

c = Counter() 
for item in something: 
    if item.has_some_property: 
     c[item.property] += 1 
    elif item.has_some_other_property: 
     c[item.other_property] += 1 
    elif item.has_some.third_property: 
     c[item.third_property] += 1 
3

Có một cách Pythonic hơn để làm những gì bạn muốn:

c = Counter(item.property for item in something if item.has_some_property) 

Nó sử dụng một generator expression thay vì mở mã hóa vòng lặp.

Chỉnh sửa: Bỏ lỡ đoạn không có danh sách hiểu. Tôi vẫn nghĩ rằng đây là cách để thực sự sử dụng Counter trong thực tế. Nếu bạn có quá nhiều mã để đưa vào một biểu thức máy phát điện hoặc danh sách hiểu, thì tốt hơn là nên đưa yếu tố đó vào một hàm và gọi nó từ một sự hiểu biết.

+0

Một danh sách hiểu, một biểu thức máy phát điện - có thể làm điều đó, nhưng với phức tạp nếu/elif/elif/etc, nó không hoạt động. – bahmait

+0

@bahmait và làm thế nào để bạn tưởng tượng 'set.add' giúp với phức tạp' if/elif/elif' etc ...? –

+0

@bahmait: Chỉ cần chỉnh sửa. Việc tính toán logic đó thành một chức năng riêng biệt là cách Pythonic để làm điều này, tôi đoán vậy. Tôi đồng ý rằng một '' add() '' phương pháp có thể là một bổ sung tốt đẹp, nhưng có lẽ thiếu sót là cố ý để đẩy mọi người đến phong cách máy phát điện. –

3
>>> c = collections.Counter(a=23, b=-9) 

Bạn có thể thêm một yếu tố mới và thiết lập giá trị của nó như thế này:

>>> c['d'] = 8 
>>> c 
Counter({'a': 23, 'd': 8, 'b': -9}) 

Tăng:

>>> c['d'] += 1 
>>> c 
Counter({'a': 23, 'd': 9, 'b': -9} 

Lưu ý rằng mặc dù c['b'] = 0 không xóa:

>>> c['b'] = 0 
>>> c 
Counter({'a': 23, 'd': 9, 'b': 0}) 

Để xóa e sử dụng del:

>>> del c['b'] 
>>> c 
Counter({'a': 23, 'd': 9}) 

Counter là một lớp con dict

+1

Bạn không thực sự 'thêm', bạn đang 'cài đặt' '' 'd''' để đếm = 8. Bạn phải sử dụng '' c ['d'] = c.get ('d', 0) + 1'' để làm việc đếm. –

+2

@ChristianAichinger, điểm tốt. btw, 'c ['d'] + = 1' hoạt động. – shx2

+0

Đây là điểm ngắt trong trường hợp. Cảm ơn tất cả. – bahmait

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