2017-02-07 2 views
2

я не могу получить мой счетчик для сортировки/отображается правильноPython сортировки Счетчик

Мой код

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

счетчик

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

, но когда я пытаюсь отобразить его в презентабельном формате , он не печатает в том же порядке, что и список счетчиков. (Предпочтительно не пол: двоеточие)

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

Счетчик зависит от Dict, которая зависит от несортированным Hashtable. – Nils

+3

То, что вы видите в «редакторе» счетчика, является внутренним словарем счетчика, который не упорядочен. Если вы хотите, чтобы содержимое было упорядочено, попробуйте 'Counter.most_common' –

+0

Какой заказ вы ожидаете? Впервые появилось, максимальное количество вхождений, мин вхождения, ключ? – AndreyF

ответ

5

Поскольку Counter не реализован в виде словаря не действительно есть чувство порядка. Если вы хотите, чтобы вручную перебирать его элементы по заказу вам нужно будет создать такой порядок:

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

Или просто перебирать список кортежей, возвращаемых методом most_common как предложено @tobias_k в комментариях:

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

Интересно отметить, что most_common реализуется почти точно так:

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

Или просто 'Counter.most_common'? Может также принимать параметр, например. 'most_common (10)' для первых десяти элементов. –

+0

@tobias_k действительно, полностью забыл о 'most_common' возвращении упорядоченного списка кортежей. благодаря – DeepSpace

0

что вы имеете в своем COUN ter является dict. порядка не является случайным, но:

ключей и значение итерации в произвольном порядке, который не является случайным, различается по реализации Python, и зависит от истории словаря вставок и удалений.

Вы можете решить эту проблему с помощью orderddict.

Упорядоченные словари - это как обычные словари, но они помнят порядок вставки предметов.

2

использование counter.most_common():

for k,v in c.most_common(): 
    print(k,v) 
Смежные вопросы