首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >嵌套Dict列表中按值排序Dict

嵌套Dict列表中按值排序Dict
EN

Stack Overflow用户
提问于 2019-04-12 05:58:12
回答 1查看 337关注 0票数 0

这让我发疯好几天了,我看到了几个关于按价值分类的问题,但是它们是简单的结构,而我的结构是复杂的。

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

代码语言:javascript
运行
复制
 {'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]}}

这段代码将给出我想要的值,但只有在第一次迭代时,我才会得到KeyError: 1

代码语言:javascript
运行
复制
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"

我想要能够按这个值对分块进行正向和反向排序。我见过:

代码语言:javascript
运行
复制
sorted(data.items(), key=lambda x:x[1])

我不知道如何将它应用于我的问题,通常情况下,我的尝试以KeyError: 1或IndexError: string超出范围结束。

我遗漏了什么?我如何引用lamba的值?这就是我要做的吗?

我不想使用包含潘达的解决方案。我正在努力提高这个速度/效率,因为数据可能相当大(目前有10,000个子键)

编辑:

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

代码语言:javascript
运行
复制
 {'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]}}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-12 06:15:47

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

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

因此,sorted(data.items(), key=lambda e: next(iter(e[1].values()))[-1])应该起作用:

代码语言:javascript
运行
复制
[('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]})]

请注意,这将返回(key, value)元组的列表,而不是字典。您必须将其反馈给dict (理想情况下是OrderedDict,可能是Python3.6中的常规dict或更高版本)以保持顺序:

代码语言:javascript
运行
复制
{'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]}}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55645334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档