python,按字符而不是键将字典转换为排序列表

ran*_*its 16 python sorting

我有一个collections.defaultdict(int),我正在构建它来计算一个键出现在一组数据中的次数.我后来希望能够以递减的方式对它进行排序(显然首先将其转换为列表),先按最高值排序.我创建了如下字典:

adict = defaultdict(int)
Run Code Online (Sandbox Code Playgroud)

后来我做了一堆:

adict['someval'] += 1
adict['anotherval'] +=1
adict['someval'] += 1
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要打印出来:

someval => 2
anotherval => 1
Run Code Online (Sandbox Code Playgroud)

Nad*_*mli 42

要获得字典排序:

from operator import itemgetter

sorted(adict.iteritems(), key=itemgetter(1), reverse=True)
Run Code Online (Sandbox Code Playgroud)


Ale*_*lli 38

一个字典的键,按相应的值反向排序,最好得到

sorted(adict, key=adict.get, reverse=True)
Run Code Online (Sandbox Code Playgroud)

因为你想要键/值对,你可以像所有其他答案所建议的那样处理项目,或者(使用漂亮的adict.get绑定方法而不是项目符号或怪异的lambdas ;-),

[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]
Run Code Online (Sandbox Code Playgroud)

编辑:就性能而言,无论是哪种方式都没有:

$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' '[(k, adict[k]) for k in sorted(adict, key=adict.get, reverse=True)]'
100000 loops, best of 3: 10.8 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6)); from operator import itemgetter' 'sorted(adict.iteritems(), key=itemgetter(1), reverse=True)'
100000 loops, best of 3: 9.66 usec per loop
$ python -mtimeit -s'adict=dict((x,x**2) for x in range(-5,6))' 'sorted(adict.iteritems(), key=lambda (k,v): v, reverse=True)'
100000 loops, best of 3: 11.5 usec per loop
Run Code Online (Sandbox Code Playgroud)

因此,.get基于两者的解决方案在性能方面处于items中等水平 - 稍微慢一点itemgetter,略快于lambda.在"瓶颈"情况下,那些微秒级分对你来说至关重要,无论如何都要关注它.在正常情况下,这个操作只是在一个更大的任务中只有一个步骤而一个微秒或多或少的事情很少,因此,关注简洁的get习语也是一个合理的选择.

  • `adict.get`变体为dict的每个项目执行两次键查找.`[(k,v)for k,v in sorted(adict.iteritems(),key = itemgetter(1),reverse = True)]`做一次. (3认同)
  • **2019 年以后对读者的警告:** Python 3 不再使用 `iteritems`。上面的评论已经有10年历史了。此外,如果您想要按值排序的键列表(并且您不关心值),只需使用“sorted(foo, key=foo.get)”。它返回按值排序的键列表。如果你只是执行“sorted(foo)”,你会得到按键排序的所有键,并通过添加“key=foo.get”,你告诉排序器按每个键的字典值对这些键进行排序。无论哪种方式,“sorted()”函数都只返回字典中的键。 (2认同)

Ant*_*sma 5

只需按值对结果字典进行排序:

for k, v in sorted(adict.items(), key=lambda kv: kv[1], reverse=True):
    print("%s => %s" % (k,v))
Run Code Online (Sandbox Code Playgroud)