Python中字典值的稳定排序

sdg*_*dgd 2 python sorting dictionary

我是Python的新手,我正在努力解决问题以提高我的编码技能.我正在研究一个问题,我需要stable sort在python中使用字典.请在下面找到详细信息:

输入:

1 2
16 3
11 2
20 3
3 5
26 4
7 1
22 4
Run Code Online (Sandbox Code Playgroud)

以上输入,我加入了两个lists k and v:

k = ['1', '16', '11', '20', '3', '26', '7', '22']
v = ['2', '3', '2', '3', '5', '4', '1', '4']
Run Code Online (Sandbox Code Playgroud)

我已将这两个列表添加到字典中,以将其作为键值对.我使用过OrderDict因为我希望元素的顺序与它们在输入中的顺序相同.

from collections import OrderedDict
d = OrderedDict(zip(k, v))
Run Code Online (Sandbox Code Playgroud)

现在,我需要d按照与值相反的顺序对字典进行排序.(我实际上必须做一个稳定的排序,因为sorted在python中是一个稳定的排序,我已经使用过了.来源:这里)为此:

s = sorted(d, key = itemgetter(1), reverse=True)
Run Code Online (Sandbox Code Playgroud)

预期产出:

 3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1
Run Code Online (Sandbox Code Playgroud)

但在我实现上述sorted功能后,我无法获得预期的输出.我明白了IndexError: string index out of range

有人能告诉我我在哪里做错了.我的方法是错误的还是流程错了?你能否告诉我为什么我无法按预期获得输出.提前致谢.任何帮助将非常感激.

NPE*_*NPE 6

这是一种方法:

>>> sorted_kv = sorted(d.items(), key=lambda (k,v):int(v), reverse=True)
>>> OrderedDict(sorted_kv)
OrderedDict([('3', '5'), ('26', '4'), ('22', '4'), ('16', '3'), ...
Run Code Online (Sandbox Code Playgroud)

这将从字典中获取键/值对,对它们进行排序,并创建具有所需顺序的新有序字典.

key=参数来sorted()指定该对是根据第二项的数值进行排序.

我需要调用的原因int()是你的字典将键和值都保存为字符串.按原样对它们进行排序将起作用,但会生成字典顺序而不是数字顺序.


alb*_*ert 5

您忘记使用.items()(Python3) 或.iteritems()(Python2)访问字典中的项目。

此外,您需要导入operator模块才能使用itemgetter().

所以代码看起来像:

import operator
from collections import OrderedDict

k = ['1', '16', '11', '20', '3', '26', '7', '22']
v = ['2', '3', '2', '3', '5', '4', '1', '4']

d = OrderedDict(zip(k, v))

out = sorted(d.items(), key=operator.itemgetter(1), reverse=True)
Run Code Online (Sandbox Code Playgroud)

清单out是这样的:

[('3', '5'), ('26', '4'), ('22', '4'), ('16', '3'), ('20', '3'), ('1', '2'), ('11', '2'), ('7', '1')]
Run Code Online (Sandbox Code Playgroud)

为了打印,您可以使用以下方法访问列表的每个元组:

for i,k in out:
    print(i,k) 
Run Code Online (Sandbox Code Playgroud)

这给出了所需的输出:

3 5
26 4
22 4
16 3
20 3
1 2
11 2
7 1
Run Code Online (Sandbox Code Playgroud)

我写了一个上面给出的代码的例子,可以在ideone.com上找到。