2017-02-07 5 views
2

Ich kann nicht meinen Zähler erhalten zu sortieren/angezeigt richtigPython Sortieren Zähler

Mein Code ist

with open('nonweb') as f: 
    for i in f: 
      entry.append(i.strip()) 
    counter=Counter(entry) 
print counter 

for z in counter: 
     print '%s : %d' % (z, counter[z]) 

Zähler

Counter({'192.168.1.45 UDP 137': 2262, '192.168.1.85 UDP 137': 2262, '192.119.43.56 UDP 53': 78, '192.119.39.68 UDP 53': 78, '192.168.92.223 UDP 10111': 78, '192.168.1.13 UDP 137': 72, '192.167.80.106 TCP 8087': 48, '192.168.1.127 UDP 8083': 48, '192.168.1.129 UDP 8083': 44, '192.218.30.124 UDP 53': 32, '192.77.58.44 TCP 5282': 24, '192.168.1.13 UDP 138': 18, '192.168.1.69 UDP 138': 14, '192.168.1.85 UDP 138': 10, '192.168.1.57 UDP 138': 10, '192.168.1.33 UDP 138': 10, '192.168.1.45 UDP 138': 10, '192.168.1.92 UDP 138': 10, '192.168.1.97 UDP 138': 10, '192.168.1.79 UDP 138': 10, '192.168.1.60 UDP 138': 10, '192.168.1.32 UDP 138': 10, '192.168.1.18 UDP 138': 10, '192.168.1.58 UDP 138': 10, '192.168.1.95 UDP 138': 10, '192.168.1.19 UDP 138': 10, '192.168.1.143 UDP 138': 10, '192.168.1.138 UDP 138': 10, '192.168.1.99 UDP 138': 10, '192.168.1.139 UDP 138': 10, '192.168.1.96 UDP 138': 10, '192.168.1.140 UDP 138': 10, '192.168.1.137 UDP 138': 10, '192.168.1.59 UDP 138': 10, '192.171.70.154 UDP 53': 6, '216.163.251.236 TCP 42590': 2, '192.168.1.140 TCP 56230': 2}) 

aber wenn ich versuche, es in ein vorzeigbar Format anzuzeigen , druckt es nicht in der gleichen Reihenfolge wie die Zählerliste. (Vorzugsweise nicht halb: Kolon)

192.168.1.45 UDP 137 : 2262 
192.168.1.85 UDP 137 : 2262 
192.168.1.85 UDP 138 : 10 
192.168.1.57 UDP 138 : 10 
192.168.1.33 UDP 138 : 10 
192.168.1.45 UDP 138 : 10 
192.168.1.92 UDP 138 : 10 
192.168.1.129 UDP 8083 : 44 
192.168.1.97 UDP 138 : 10 
192.168.1.13 UDP 137 : 72 
192.168.1.79 UDP 138 : 10 
+1

Zähler hängt von dict, die auf unsortiert hashtable abhängt. – Nils

+3

Was Sie im 'repr' des Counters sehen, ist das interne Wörterbuch des Counters, das nicht geordnet ist. Wenn Sie den Inhalt in sortierter Reihenfolge haben möchten, versuchen Sie 'Counter.most_common' –

+0

Was ist die Reihenfolge, die Sie erwarten? Zuerst erschienen, max Vorkommen, min Vorkommen, Schlüssel? – AndreyF

Antwort

5

Da Counter als Wörterbuch implementiert es nicht wirklich ein Gefühl der Ordnung hat. Wenn Sie manuell wollen über seine Elemente iterieren im Auftrag benötigen Sie eine solche Ordnung zu schaffen:

# reverse=True to get descending order 
for k, v in sorted(counter_obj.items(), key=lambda x: x[1], reverse=True): 
    print(k, v) 

Oder einfach über die Liste von Tupeln von der most_common-Methode zurücklaufen, wie durch @tobias_k in den Kommentaren vorgeschlagen:

for k, v in c.most_common(): 
    print(k, v) 

interessant, dass most_common in fast die genaue Art und Weise durchgeführt wird:

def most_common(self, n=None): 
     '''List the n most common elements and their counts from the most 
     common to the least. If n is None, then list all element counts. 

     >>> Counter('abcdeabcdabcaba').most_common(3) 
     [('a', 5), ('b', 4), ('c', 3)] 

     ''' 
     # Emulate Bag.sortedByCount from Smalltalk 
     if n is None: 
      return sorted(self.items(), key=_itemgetter(1), reverse=True) 
     return _heapq.nlargest(n, self.items(), key=_itemgetter(1)) 
+2

Oder nur 'Counter.most_common'? Kann auch einen Parameter annehmen, z.B. 'most_common (10)' für die Top-Ten-Elemente. –

+0

@tobias_k in der Tat, total vergessen 'most_common' zurückgeben geordnete Liste von Tupeln. Vielen Dank – DeepSpace

0

Was Sie in Ihrem Coun haben ter Objekt ist ein dict. Die Reihenfolge ist nicht zufällig, sondern:

Schlüssel und Werte werden in einer beliebigen Reihenfolge iteriert, die nicht zufällig ist, variiert über Python-Implementierungen, und ist abhängig von der Geschichte des Wörterbuch von Einfügungen und Löschungen.

Sie könnten dies mit Hilfe einer orderddict lösen.

Geordnete Wörterbücher sind wie normale Wörterbücher, sie erinnern sich jedoch an die Reihenfolge, in der Artikel eingefügt wurden.

2

Verwendung counter.most_common():

for k,v in c.most_common(): 
    print(k,v)