Sayacı değere göre nasıl sıralayabilirim? - python


145

Tersine çevrilmiş liste kavrayışının liste kavrayışlarını yapmaktan başka, Counter'ı değere göre sıralamanın pythonic bir yolu var mı? Öyleyse, bundan daha hızlıdır:

>>> 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)

Yanıtlar:


251

Counter.most_common()Yöntemi kullanın, öğeleri sizin için sıralar :

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

Bunu mümkün olan en verimli şekilde yapar; tüm değerler yerine bir Top N isterseniz, heapqdüz sıralama yerine a kullanılır:

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

Sayaçların dışında, sıralama her zaman bir keyişleve göre ayarlanabilir ; .sort()ve sorted()her ikisi de giriş sırasının sıralanacağı bir değer belirlemenizi sağlayan çağrılabilir; sorted(x, key=x.get, reverse=True)size aynı sıralama verir x.most_common(), ancak yalnızca anahtarları döndürür, örneğin:

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

veya yalnızca verilen (key, value)çiftlere göre sıralama yapabilirsiniz :

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

Daha fazla bilgi için Python sıralama kılavuzuna bakın .


30

@MartijnPieters cevabına oldukça hoş bir eklenti, sadece bir demet döndürdüğü için ortaya çıkarak sıralanan bir sözlüğü geri almaktırCollections.most_common . Ben sık sık kullanışlı günlük dosyaları için bir json çıkışı ile bu çift:

from collections import Counter, OrderedDict

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

Çıktı ile:

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

10

Evet:

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

Sıralanmış anahtar kelime anahtarını ve lambda işlevini kullanma:

>>> 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)]

Bu tüm sözlükler için geçerlidir. Bununla birlikte Counter, size sıralanmış öğeleri (en sık, en az sıklıkta) veren özel bir işlevi vardır. Adı 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)]

Ayrıca kaç öğe görmek istediğinizi de belirtebilirsiniz:

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

Sıralamayı tersine çevirmenin başka bir yolu da anahtar işlevi olarak ayarlamaktırlamda i: -i[1]
Steinar Lima

4

Daha genel sıralama, keyanahtar kelimenin sıralama yöntemini tanımladığı, sayısal türün eksi azalacağını göstermeden önce:

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

2
keyAnahtar ayırma yöntemi tanımlar, eksi sayısal türü önce azalan göstermektedir
Alex SEAM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.