2017-07-12 4 views
-1

Ich habe einen Zähler, den ich in der folgenden Art und Weise sortieren mag:Wie sortieren Zähler nach alphabetischer Reihenfolge dann von Wert, um in Python

Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1}) 

, wenn ich meinen Code zu verwenden, hier ist, was es gibt mir :

Counter({'M': 9, 'P': 5, 'L': 5, 'S': 2, 'T': 1, 'd': 1}) 

habe ich versucht, die Funktion sortiert(), aber wenn ich es verwende, ist der Rückgabewert nicht mehr ein Zähler.

Hier ist mein Code, wie würdest du das tun?

def most_encountered_letters(dictionnary): 
    counter = collections.Counter() 
    for line in dictionnary: 
     words = line.split(',')[0].split(' ') 
     for word in words: 
      counter[word[0]] += 1 

    print(counter)                           
    return counter.most_common(5) 
+1

Ein 'Counter' ist eine' Dict'-Unterklasse, also per Definition unsortiert, und wenn Sie versuchen, 'sorted()' zu verwenden, muss eine Nicht-'Dict'-Klasse zurückgegeben werden. Sie könnten das Ergebnis in ein ['OrderedDict'] (https://stackoverflow.com/a/9001529/1270789) verschieben. Ich nehme an, aber meine Frage ist: "Warum willst du sortieren?", Da dein tatsächliches Problem vielleicht besser auf andere Weise angegangen werden könnte. Schließlich, hier ist [viele Arten zu sortieren] (https://wiki.python.org/moin/HowTo/Sorting). BTW, Python 2.x oder 3.x? –

+0

Es ist nicht möglich, ein 'Dict' in Python zu sortieren, die einzige Möglichkeit ist der Link https://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value?page=1&tab= votes # tab-top – Wen

+0

_Be präzise_! Ihre Nicht-Antwort hat Ihre Frage drastisch geändert und beide Antworten ungültig gemacht. –

Antwort

2

Counter s sind ungeordnet. Sie sind eine Unterklasse von dict und sind wie dict nicht geordnet. Es macht keinen Sinn, "eine sortierte Counter" zu sagen. Sie können erhalten eine Liste der Elemente in Counter sortiert, wie Sie wollen, zum Beispiel:

>>> from collections import Counter 
>>> c = Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'd': 1, 'T': 1}) 
>>> c 
Counter({'M': 9, 'L': 5, 'P': 5, 'S': 2, 'T': 1, 'd': 1}) 
>>> sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True) 
[('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)] 

Wenn Sie eine geordnete Mapping Typ möchten, müssen Sie entweder die integrierte in OrderedDict verwenden, oder implementieren Sie Ihre eigene . Wir können die mehrfache Vererbung verwenden, um integrierte Klassen wiederzuverwenden, um zu bekommen, was wir wollen. Dies ist ein Rezept straight from the docs:

class OrderedCounter(Counter, OrderedDict): 
    'Counter that remembers the order elements are first encountered' 

    def __repr__(self): 
     return '%s(%r)' % (self.__class__.__name__, OrderedDict(self)) 

    def __reduce__(self): 
     return self.__class__, (OrderedDict(self),) 

Also, in Aktion:

>>> oc = OrderedCounter() 
>>> for k,v in sorted(c.items(), key= lambda t: (t[1], t[0]), reverse=True): 
...  oc[k] = v 
... 
>>> oc 
OrderedCounter(OrderedDict([('M', 9), ('P', 5), ('L', 5), ('S', 2), ('d', 1), ('T', 1)])) 
>>> for k,v in oc.items(): 
... print(k,v) 
... 
M 9 
P 5 
L 5 
S 2 
d 1 
T 1 
>>> 

Noch wichtiger ist, sollten Sie überlegen, warum Sie eine geordnete Counter brauchen ... tun Sie wirklich man braucht?

Verwandte Themen