2012-06-14 34 views
17

Trong Python 2 (2.7, để chính xác hơn), tôi muốn lặp qua một bộ sưu tập.Các thể hiện trong thứ tự đếm theo thứ tự giảm dần.Cách Pythonic để lặp qua một collection.Counter() instance trong thứ tự giảm dần?

>>> import collections 
>>> c = collections.Counter() 
>>> c['a'] = 1 
>>> c['b'] = 999 
>>> c 
Counter({'b': 999, 'a': 1}) 
>>> for x in c: 
     print x 
a 
b 

Trong ví dụ trên, có vẻ như các phần tử được lặp lại theo thứ tự chúng được thêm vào phiên bản Bộ đếm.

Tôi muốn lặp qua danh sách từ cao nhất đến thấp nhất. Tôi thấy rằng chuỗi đại diện của Counter làm điều này, chỉ cần tự hỏi nếu có một cách được đề nghị để làm điều đó.

Trả lời

20

Bạn có thể lặp qua c.most_common() để nhận các mục theo thứ tự mong muốn. Xem thêm documentation of Counter.most_common().

Ví dụ:

>>> c = collections.Counter(a=1, b=999) 
>>> c.most_common() 
[('b', 999), ('a', 1)] 
+0

Doh! RTFM. Tôi đã bỏ lỡ điều đó trong lần đọc đầu tiên của tôi. Cảm ơn! – Inactivist

1

Vấn đề của bạn đã được giải quyết chỉ trả về thứ tự giảm dần nhưng ở đây là làm thế nào để làm điều đó quát. Trong trường hợp người khác đến từ Google ở ​​đây là cách tôi phải giải quyết nó. Về cơ bản những gì bạn có ở trên trả về các khóa cho từ điển bên trong collections.Counter(). Để nhận được các giá trị bạn chỉ cần chuyển khóa về từ điển như sau:

for x in c: 
    key = x 
    value = c[key] 

Tôi có vấn đề cụ thể hơn khi tôi đếm từ và muốn lọc ra các từ tần số thấp. Bí quyết ở đây là tạo một bản sao của collection.Counter() hoặc bạn sẽ nhận được "RuntimeError: từ điển thay đổi kích thước trong khi lặp lại" khi bạn cố gắng loại bỏ chúng khỏi từ điển.

for word in words.copy(): 
    # remove small instance words 
    if words[word] <= 3: 
     del words[word] 
2

Dưới đây là ví dụ để lặp Counter trong bộ sưu tập Python:

>>>def counterIterator(): 
import collections 
counter = collections.Counter() 
counter.update(('u1','u1')) 
counter.update(('u2','u2')) 
counter.update(('u2','u1')) 
for ele in counter: 
    print(ele,counter[ele]) 
>>>counterIterator() 
u1 3 
u2 3 
Các vấn đề liên quan