Python 在嵌套Dict列表中按值对Dict排序

Python 在嵌套Dict列表中按值对Dict排序,python,dictionary,Python,Dictionary,这已经让我发疯好几天了,我看到了一些关于按值排序的问题,但它们的结构很简单,而我的结构很复杂 我的顶级Dict键是散列,子Dict键是序列#,子Dict值是列表。其中的最后一个值是一个数字,这就是我想要对顶级Dict进行排序的依据。Dict的大小可能相当大,但下面是一个示例: {'16741b673a418af3812f6d43ea3f7daf': {1: [0, '16741b673a418af3812f6d43ea3f7daf', 'data-01', 1132], 2

这已经让我发疯好几天了,我看到了一些关于按值排序的问题,但它们的结构很简单,而我的结构很复杂

我的顶级Dict键是散列,子Dict键是序列#,子Dict值是列表。其中的最后一个值是一个数字,这就是我想要对顶级Dict进行排序的依据。Dict的大小可能相当大,但下面是一个示例:

 {'16741b673a418af3812f6d43ea3f7daf': 
    {1: [0, '16741b673a418af3812f6d43ea3f7daf', 'data-01', 1132],
     2: [1, '16741b673a418af3812f6d43ea3f7daf', 'data-02', 1132],
     3: [2, '16741b673a418af3812f6d43ea3f7daf', 'data-03', 1132]},

 'cbef6de99cc2b9739c824db6d0246093':
    {4: [0, 'cbef6de99cc2b9739c824db6d0246093', 'data-04', 55296],
     5: [1, 'cbef6de99cc2b9739c824db6d0246093', 'data-05', 55296],
     6: [1, 'cbef6de99cc2b9739c824db6d0246093', 'data-06', 55296],
     7: [2, 'cbef6de99cc2b9739c824db6d0246093', 'data-07', 55296]},
 'a1e0f7ccdd8d38cb5ae00cdac71b6724':
    {8: [0, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-08', 20125],
     9: [1, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-09', 20125],
    10: [1, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-10', 20125]}}
这段代码将给出我正在寻找的值,但只针对第一次迭代,然后我得到keyrerror:1

for item1 in mydict.items():
    print(item1[1][1][3])

item1[1] returns subkey 1's list
item1[2] returns subkey 2's list
item1[3] returns subkey 3's list
item1[1][1][3] returns subkey 1's "value"
我希望能够按照该值对dict进行正向和反向排序。我看到:

sorted(data.items(), key=lambda x:x[1])
我不知道如何将其应用于我的问题,通常我的尝试最终会导致KeyError:1或IndexError:string超出范围

我错过了什么? 如何为lamba引用该值? 这就是我需要做的吗

我不希望使用包含熊猫的解决方案。由于数据可能相当大(目前有10000个子键),因此我正在尝试使其快速/高效

编辑:

输出看起来相同,但按列表中的最后一个值排序:

 {'16741b673a418af3812f6d43ea3f7daf': 
    {1: [0, '16741b673a418af3812f6d43ea3f7daf', 'data-01', 1132],
     2: [1, '16741b673a418af3812f6d43ea3f7daf', 'data-02', 1132],
     3: [2, '16741b673a418af3812f6d43ea3f7daf', 'data-03', 1132]},

 'a1e0f7ccdd8d38cb5ae00cdac71b6724':
    {8: [0, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-08', 20125],
     9: [1, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-09', 20125],
    10: [1, 'a1e0f7ccdd8d38cb5ae00cdac71b6724', 'data-10', 20125]},

 'cbef6de99cc2b9739c824db6d0246093':
    {4: [0, 'cbef6de99cc2b9739c824db6d0246093', 'data-04', 55296],
     5: [1, 'cbef6de99cc2b9739c824db6d0246093', 'data-05', 55296],
     6: [1, 'cbef6de99cc2b9739c824db6d0246093', 'data-06', 55296],
     7: [2, 'cbef6de99cc2b9739c824db6d0246093', 'data-07', 55296]}}

您的问题有点不清楚,据我所知,您有
{k1:{k2:[v1,v2,v3,v4]}
,您希望按照
v4
对每个顶级条目进行排序,每个列表中的条目应该相同(因此,我们选择哪个条目并不重要)。但是,子条目(
k2
)在顶级条目之间不是恒定的

从子条目中获取v4很容易(
[3]
[-1]
)问题是获取第二级指令的任意值。
下一步(iter(d.values())
应该做的是:迭代子值(列表),并从迭代器中获取第一个值。并不是说如果子条目为空(顶级键映射到空dict),这将引发错误

因此
排序(data.items(),key=lambda e:next(iter(e[1].values())[-1])
应该可以:

[('16741b673a418af3812f6d43ea3f7daf',
{1:[0',16741b673a418af3812f6d43ea3f7daf','data-01',1132],
2:[1,'16741b673a418af3812f6d43ea3f7daf','data-02',1132],
3:[2,'16741b673a418af3812f6d43ea3f7daf','data-03',1132],
('a1e0f7ccdd8d38cb5ae00cdac71b6724',
{8:[0',a1e0f7ccdd8d38cb5ae00cdac71b6724','data-08',20125],
9:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-09',20125],
10:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-10',20125],
('cbef6de99cc2b9739c824db6d0246093',
{4:[0',cbef6de99cc2b9739c824db6d0246093','data-04',55296],
5:[1,'cbef6de99cc2b9739c824db6d0246093','data-05',55296],
6:[1,'cbef6de99cc2b9739c824db6d0246093','data-06',55296],
7:[2,'cbef6de99cc2b9739c824db6d0246093','data-07',55296]}]
请注意,这将返回
(键、值)
元组列表,而不是字典。您必须将其反馈给
dict
(理想情况下是OrderedDict,可能是Python 3.6或更高版本中的常规
dict
),以保持顺序:

{'16741b673a418af3812f6d43ea3f7daf':
{1:[0',16741b673a418af3812f6d43ea3f7daf','data-01',1132],
2:[1,'16741b673a418af3812f6d43ea3f7daf','data-02',1132],
3:[2,'16741b673a418af3812f6d43ea3f7daf','data-03',1132],
“a1e0f7ccdd8d38cb5ae00cdac71b6724”:
{8:[0',a1e0f7ccdd8d38cb5ae00cdac71b6724','data-08',20125],
9:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-09',20125],
10:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-10',20125],
“cbef6de99cc2b9739c824db6d0246093”:{
4:[0,'cbef6de99cc2b9739c824db6d0246093','data-04',55296],
5:[1,'cbef6de99cc2b9739c824db6d0246093','data-05',55296],
6:[1,'cbef6de99cc2b9739c824db6d0246093','data-06',55296],
7:[2,'cbef6de99cc2b9739c824db6d0246093','data-07',55296]}

您的问题有点不清楚,据我所知,您有
{k1:{k2:[v1,v2,v3,v4]}
,您希望按照
v4
对每个顶级条目进行排序,每个列表中的条目都应该相同(因此,我们选择哪个条目并不重要)。但是,子条目(
k2
)在顶级条目之间不是恒定的

从子条目中获取v4很容易(
[3]
[-1]
)问题是获取第二级指令的任意值。
下一步(iter(d.values())
应该做的是:迭代子值(列表),并从迭代器中获取第一个值。并不是说如果子条目为空(顶级键映射到空dict),这将引发错误

因此
排序(data.items(),key=lambda e:next(iter(e[1].values())[-1])
应该可以:

[('16741b673a418af3812f6d43ea3f7daf',
{1:[0',16741b673a418af3812f6d43ea3f7daf','data-01',1132],
2:[1,'16741b673a418af3812f6d43ea3f7daf','data-02',1132],
3:[2,'16741b673a418af3812f6d43ea3f7daf','data-03',1132],
('a1e0f7ccdd8d38cb5ae00cdac71b6724',
{8:[0',a1e0f7ccdd8d38cb5ae00cdac71b6724','data-08',20125],
9:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-09',20125],
10:[1,'a1e0f7ccdd8d38cb5ae00cdac71b6724','data-10',20125],
('cbef6de99cc2b9739c824db6d0246093',
{4:[0',cbef6de99cc2b9739c824db6d0246093','data-04',55296],
5:[1,'cbef6de99cc2b9739c824db6d0246093','data-05',55296],
6:[1,'cbef6de99cc2b9739c824db6d0246093','data-06',55296],
7:[2,'cbef6de99cc2b9739c824db6d0246093','data-07',55296]}]
请注意,这将返回
(键、值)
元组列表,而不是字典。您必须将其反馈给
dict
(理想情况下是OrderedDict,可能是Python 3.6或更高版本中的常规
dict
),以保持顺序:

{'16741b673a418af3812f6d43ea3f7daf':
{1:[0',16741b673a418af3812f6d43ea3f7daf','data-01',1132],
2:[1,'16741b673a418af3812f6d43ea3f7daf','data-02',1132],
3:[2,'16741b673a418af3812f6d43ea3f7daf','data-03',1132],
“a1e0f7ccdd8d38cb5ae00cdac71b6724”:
{8:[0,'a1e0f7ccdd8d38cb5ae00cd