首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python排序计数器

Python排序计数器
EN

Stack Overflow用户
提问于 2017-02-07 14:51:17
回答 3查看 2.7K关注 0票数 3

我无法使我的计数器正确排序/显示。

我的代码是

代码语言:javascript
复制
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])

计数器是

代码语言:javascript
复制
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})

但是,当我试图以体面的格式显示它时,它不会按照与计数器列表相同的顺序打印。(最好没有分号:冒号)

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-02-07 14:54:40

因为Counter是作为字典实现的,所以它没有真正的有序感。如果要按顺序手动迭代其元素,则需要创建这样的顺序:

代码语言:javascript
复制
# reverse=True to get descending order
for k, v in sorted(counter_obj.items(), key=lambda x: x[1], reverse=True):
    print(k, v)

或者像@tobias_k在注释中建议的那样,简单地迭代由@tobias_k方法返回的元组列表:

代码语言:javascript
复制
for k, v in c.most_common():
    print(k, v)

值得注意的是,most_common是以几乎精确的方式实现的:

代码语言:javascript
复制
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))
票数 6
EN

Stack Overflow用户

发布于 2017-02-07 14:59:19

使用counter.most_common()

代码语言:javascript
复制
for k,v in c.most_common():
    print(k,v)
票数 2
EN

Stack Overflow用户

发布于 2017-02-07 14:58:50

计数器对象中包含的是一个dict。顺序不是随机的,而是:

键和值按非随机的任意顺序迭代,在Python实现中各不相同,并且取决于字典的插入和删除历史。

您可以通过使用orderddict来解决这个问题。

有序字典就像普通字典一样,但它们记住插入条目的顺序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42092882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档