Làm thế nào để sắp xếp Counter theo giá trị? - trăn


144

Khác với việc hiểu danh sách của việc hiểu danh sách đảo ngược, có cách nào để sắp xếp Counter theo giá trị không? Nếu vậy, nó nhanh hơn thế này:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x)
['a', 'b', 'c']
>>> sorted(x.items())
[('a', 5), ('b', 3), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()])]
[('b', 3), ('a', 5), ('c', 7)]
>>> [(l,k) for k,l in sorted([(j,i) for i,j in x.items()], reverse=True)]
[('c', 7), ('a', 5), ('b', 3)

Câu trả lời:


250

Sử dụng Counter.most_common()phương pháp , nó sẽ sắp xếp các mục cho bạn :

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]

Nó sẽ làm như vậy theo cách hiệu quả nhất có thể; nếu bạn yêu cầu Top N thay vì tất cả các giá trị, a heapqđược sử dụng thay vì sắp xếp thẳng:

>>> x.most_common(1)
[('c', 7)]

Bên ngoài quầy, việc sắp xếp luôn có thể được điều chỉnh dựa trên một keychức năng; .sort()sorted()cả hai đều có thể gọi được cho phép bạn chỉ định một giá trị để sắp xếp chuỗi đầu vào; sorted(x, key=x.get, reverse=True)sẽ cung cấp cho bạn cách sắp xếp giống như x.most_common(), nhưng chỉ trả về các khóa, ví dụ:

>>> sorted(x, key=x.get, reverse=True)
['c', 'a', 'b']

hoặc bạn chỉ có thể sắp xếp theo các giá trị đã cho (key, value):

>>> sorted(x.items(), key=lambda pair: pair[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Xem hướng dẫn sắp xếp Python để biết thêm thông tin.


30

Một bổ sung khá hay cho câu trả lời của @MartijnPieters là lấy lại một từ điển được sắp xếp theo sự xuất hiện vì Collections.most_commonchỉ trả về một tuple. Tôi thường kết hợp điều này với đầu ra json cho các tệp nhật ký tiện dụng:

from collections import Counter, OrderedDict

x = Counter({'a':5, 'b':3, 'c':7})
y = OrderedDict(x.most_common())

Với đầu ra:

OrderedDict([('c', 7), ('a', 5), ('b', 3)])
{
  "c": 7, 
  "a": 5, 
  "b": 3
}

10

Đúng:

>>> from collections import Counter
>>> x = Counter({'a':5, 'b':3, 'c':7})

Sử dụng khóa từ khóa được sắp xếp và hàm lambda:

>>> sorted(x.items(), key=lambda i: i[1])
[('b', 3), ('a', 5), ('c', 7)]
>>> sorted(x.items(), key=lambda i: i[1], reverse=True)
[('c', 7), ('a', 5), ('b', 3)]

Điều này làm việc cho tất cả các từ điển. Tuy nhiên Countercó một chức năng đặc biệt đã cung cấp cho bạn các mục được sắp xếp (từ thường xuyên nhất, đến ít thường xuyên nhất). Nó được gọi là most_common():

>>> x.most_common()
[('c', 7), ('a', 5), ('b', 3)]
>>> list(reversed(x.most_common()))  # in order of least to most
[('b', 3), ('a', 5), ('c', 7)]

Bạn cũng có thể chỉ định số lượng mục bạn muốn xem:

>>> x.most_common(2)  # specify number you want
[('c', 7), ('a', 5)]

Một cách khác để sắp xếp ngược lại là đặt chức năng chính thànhlamda i: -i[1]
Steinar Lima

4

keySắp xếp tổng quát hơn, trong đó từ khóa xác định phương thức sắp xếp, trừ đi trước khi kiểu số biểu thị giảm dần:

>>> x = Counter({'a':5, 'b':3, 'c':7})
>>> sorted(x.items(), key=lambda k: -k[1])  # Ascending
[('c', 7), ('a', 5), ('b', 3)]

2
Các keytừ khóa xác định phương pháp phân loại, trừ trước khi loại số là dấu hiệu của giảm dần
Alex Seam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.