2012-06-14 7 views
17

In Python 2 (2.7, um genau zu sein), ich möchte über eine collections.Counter-Instanz in absteigender Reihenfolge durchlaufen.Pythonischer Weg, um über eine collections.Counter() - Instanz in absteigender Reihenfolge zu iterieren?

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

Im Beispiel oben, scheint es, dass die Elemente in der Reihenfolge iteriert werden sie auf die Gegen Instanz hinzugefügt wurden.

Ich würde gerne über die Liste von der höchsten zur niedrigsten iterieren. Ich sehe, dass die String-Darstellung von Counter dies tut und sich nur fragt, ob es einen empfohlenen Weg dafür gibt.

Antwort

20

Sie können über c.most_common() iterieren, um die Elemente in der gewünschten Reihenfolge zu erhalten. Siehe auch die documentation of Counter.most_common().

Beispiel:

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

Doh! RTFM. Das habe ich bei meinem ersten Lesen verpasst. Vielen Dank! – Inactivist

1

Ihr Problem für gerade Rückkehr absteigende Reihenfolge gelöst wurde, aber hier ist, wie es allgemein zu tun. Falls jemand hier von Google her kommt, musste ich es lösen. Im Grunde, was Sie oben haben, gibt die Schlüssel für das Wörterbuch in Sammlungen zurück. Counter(). Um die Werte zu erhalten, müssen Sie nur den Schlüssel zu übergeben zurück in das Wörterbuch wie folgt:

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

Ich hatte ein spezifisches Problem, wo ich Wort zählt hatte und wollte die niedrige Frequenz diejenigen herauszufiltern. Der Trick hier ist, eine Kopie der Sammlungen zu machen. Counter() oder Sie erhalten "RuntimeError: Wörterbuch änderte Größe während Iteration", wenn Sie versuchen, sie aus dem Wörterbuch zu entfernen.

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

Hier ist das Beispiel die Zähler in Python Sammlungen iterieren:

>>>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 
Verwandte Themen