我试图按第三列对字典的输出进行排序,或者更具体地说,按示例结果中出现的值的计数进行排序。对于上下文,提供的原始答案在这里:https://stackoverflow.com/a/23199901/666891 。我无法从 https://stackoverflow.com/a/73050/666891 得到答案或https://stackoverflow.com/a/613218/666891所以我在这里问。
原始输出来自:
for k in ret.keys():
print '%s %d' % (k,ret[k])
结果是:
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
最后尝试:
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])
最佳答案
如果您尝试根据值进行排序,则 key
参数应该获取一个函数,该函数可以给出与当前键对应的值,如下所示
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:最后一个代码的问题是,您正在使用operator.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: 第二个示例的问题是,sorted 不会更改 x
,它返回一个新列表。因此,您仍然仅使用未排序的 x
。
关于python - 按计数值对字典进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23691899/