为了账号安全,请及时绑定邮箱和手机立即绑定

在 Python 中对字典进行排序

在 Python 中对字典进行排序

DIEA 2021-12-29 20:21:14
我使用 Python 3,6,我需要按值对多维字典进行排序。预期的结果是输出将按Num_Subdir值排序,并显示相同的字典,但具有此顺序。我通过函数获取字典,并将此函数的输出重定向到 var 'Dirs',因此 dirs 是字典。我尝试使用sorted函数,但一直收到此错误:orden = sorted(['dirs'], key = lambda x: x['Num_Subdir'])错误:TypeError: string indices must be integers编辑我简化了我的字典,只得到我将来会使用的:{'1234': {'/root/git/dir1/1234': 10}, 'cece': {'/root/git/dir1/cece': 0}, 'dir11': {'/root/git/dir1/dir11': 7}, 'dir13': {'/root/git/dir1/dir13': 7}, 'dir14': {'/root/git/dir1/dir14': 11}, 'dir15': {'/root/git/dir1/dir15': 12}, 'dir16': {'/root/git/dir1/dir16': 0}, 'dir17': {'/root/git/dir1/dir17': 0}, 'dir18': {'/root/git/dir1/dir18': 0}, 'jaja': {'/root/git/dir1/jaja': 0}, 'ola1': {'/root/git/dir1/ola1': 0}}我现在如何按目录的值排序?编辑2:我得到了它: sorted(dicta.items(), key=lambda x: [int(x) for x in x[1].values()], reverse = True)
查看完整描述

3 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

如果将您的 dict 更简化为:


dirs = {

 '/root/git/dir1/1234': 10,

 '/root/git/dir1/cece': 0,

 '/root/git/dir1/dir11': 7,

 '/root/git/dir1/dir13': 7,

 '/root/git/dir1/dir14': 11,

 '/root/git/dir1/dir15': 12,

 '/root/git/dir1/dir16': 0,

 '/root/git/dir1/dir17': 0,

 '/root/git/dir1/dir18': 0,

 '/root/git/dir1/jaja': 0,

 '/root/git/dir1/ola1': 0}

然后您可以按数字排序打印它:


print('{' + ',\n'.join(

    '\'{}\': {}'.format(x, y) for x, y in sorted(

    dirs.items(), key=lambda x: x[1])) + '}')

输出:


{'/root/git/dir1/ola1': 0,

'/root/git/dir1/cece': 0,

'/root/git/dir1/dir18': 0,

'/root/git/dir1/dir17': 0,

'/root/git/dir1/jaja': 0,

'/root/git/dir1/dir16': 0,

'/root/git/dir1/dir11': 7,

'/root/git/dir1/dir13': 7,

'/root/git/dir1/1234': 10,

'/root/git/dir1/dir14': 11,

'/root/git/dir1/dir15': 12}


查看完整回答
反对 回复 2021-12-29
?
www说

TA贡献1775条经验 获得超8个赞

我认为问题在于您使用的数据结构!


默认情况下,python 中的字典没有称为排序的功能。因此,您需要考虑替代方案。


解决这个问题的方法之一是使用元组列表。


为什么是元组列表?


元组列表可以在必要时轻松转换为 dict。例如,


>>> list_of_tuples = [('a', 'b'), ('c', 'd')]

>>> a_dict = dict(list_of_tuples)

>>> a_dict

{'a': 'b', 'c': 'd'}

现在,由于您的数据是 dict 格式,您需要将其转换为可以使用 dict.items() 方法完成的元组列表。就是这样


>>> a_dict.items()

dict_items([('a', 'b'), ('c', 'd')])

>>> list(a_dict.items())

[('a', 'b'), ('c', 'd')]

结果与 完全相同list_of_tuples。请记住,dict 类型对象的键应该始终是不可变的数据类型。


现在,回到你的问题,


我尝试使用排序函数,但一直收到此错误: orden = sorted(['dirs'], key = lambda x: x['Num_Subdir']) 错误: TypeError: string indices must be integers


您在 x 中获得的值是一个字符串,而不是一个 dict 类型的对象。因此,TypeError.


获取编辑结果:


data_dict = {k: {v['Path']: v['Num_Subdir']} for k, v in d['Subdir'].items()}

更改为建议的数据结构


data = [(k, (v['Path'], v['Num_Subdir'])) for k, v in d['Subdir'].items()]

按路径排序


data.sort(key=lambda item: item[1][0], reverse=False)

按 Num_Subdir 排序


data.sort(key=lambda item: item[1][1], reverse=False)

按子目录名称排序


data.sort(key=lambda item: item[0], reverse=False)  # reverse=True for descending order


查看完整回答
反对 回复 2021-12-29
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

希望这可以帮助...


试试 OrderedDict,这是非常有用的一个,


>>>from collections import OrderedDict

>>>final_response1 = OrderedDict(sorted(dirs['Subdir']['1234']['Subdir'].items(),key=lambda t: t[0]))

#In the above these were the reference that you have stored **"dirs['Subdir']['1234']['Subdir'].items()"**

现在您将获得已排序的项目。


查看完整回答
反对 回复 2021-12-29
  • 3 回答
  • 0 关注
  • 145 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信