Python 按计数值对字典排序

Python 按计数值对字典排序,python,dictionary,Python,Dictionary,我试图按照第三列对字典的输出进行排序,或者更具体地说,按照示例结果中出现的值的计数进行排序。对于上下文,提供的原始答案如下:。我无法从中得出答案,因此我在这里提问 原始输出来自: for k in ret.keys(): print '%s %d' % (k,ret[k]) 其结果是: google com 1132 akamaiedge net 378 bing com 381 microsoft com 197 google com 1132 akamaiedge net 378

我试图按照第三列对字典的输出进行排序,或者更具体地说,按照示例结果中出现的值的计数进行排序。对于上下文,提供的原始答案如下:。我无法从中得出答案,因此我在这里提问

原始输出来自:

for k in ret.keys():
    print '%s %d' % (k,ret[k])
其结果是:

google com 1132
akamaiedge net 378
bing com 381
microsoft com 197
google com 1132
akamaiedge net 378
bing com 381
microsoft com 197
并尝试:

x = ret.keys()
sorted(x,key=operator.itemgetter(3))
for k in x:
    print '%s %d' % (k,ret[k])
其结果是:

google com 1132
akamaiedge net 378
bing com 381
microsoft com 197
google com 1132
akamaiedge net 378
bing com 381
microsoft com 197
最后尝试:

for k in sorted(ret.keys(),key=operator.itemgetter(3),reverse=True):
    print '%s %d' % (k,ret[k])
这导致了与第一个类似的输出:

microsoft com 197
akamaiedge net 378
google com 1132
bing com 381
此外,
ret.keys()
的值为:

['google com', 'akamaiedge net', 'bing com', 'microsoft com']
我的特定场景的解决方案是:

for k in sorted(ret.keys(), key=lambda k:ret[k], reverse=True):
    print "{:15} - {}".format(k, ret[k])

如果您试图根据值进行排序,那么
参数应该得到一个函数,该函数可以给出与当前键对应的值,如下所示

d = {'google com':1132,'akamaiedge net':378,'bing com':381,'microsoft com':197}
for key in sorted(d, key=d.get):
    print "{:15} - {}".format(key, d[key])
输出

microsoft com   - 197
akamaiedge net  - 378
bing com        - 381
google com      - 1132
现在,每当排序算法在字典中拾取一个键时,它都会调用
key
函数,这是字典的getter函数,它将给出对应于键的值。因此,与键对应的值将用于比较

注意1:上一个代码的问题是,您使用的是
操作符.itemgetter(3)
,它将获取键中索引3处的元素。键是字符串,因此键中的第四个字符将用于比较。这就是为什么你问题的最后一个例子显示

mic*r*osoft com 197
aka*m*aiedge net 378
goo*g*le com 1132
bin*g* com 381
按字母顺序
r>m>g


注意2:第二个示例的问题是,排序不会改变
x
,它会返回一个新列表。因此,您仍然只使用未排序的
x

我坚持原来使用的解决方案:

它使用的方法本质上是使用
sorted()。不需要手动操作

仅供参考,以下是python2.7上的
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.iteritems(), key=_itemgetter(1), reverse=True)
    return _heapq.nlargest(n, self.iteritems(), key=_itemgetter(1))