这让我发疯好几天了,我看到了几个关于按价值分类的问题,但是它们是简单的结构,而我的结构是复杂的。
我的顶级Dict键是一个散列,sub键是一个序列#,sub值是一个列表。这个值中的最后一个值是一个数字,这就是我想要对顶级数据进行排序的内容。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]}}这段代码将给出我想要的值,但只有在第一次迭代时,我才会得到KeyError: 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"我想要能够按这个值对分块进行正向和反向排序。我见过:
sorted(data.items(), key=lambda x:x[1])我不知道如何将它应用于我的问题,通常情况下,我的尝试以KeyError: 1或IndexError: string超出范围结束。
我遗漏了什么?我如何引用lamba的值?这就是我要做的吗?
我不想使用包含潘达的解决方案。我正在努力提高这个速度/效率,因为数据可能相当大(目前有10,000个子键)
编辑:
输出看起来相同,但按列表中的最后一个值排序:
{'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]}}发布于 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])应该起作用:
[('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或更高版本)以保持顺序:
{'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]}}https://stackoverflow.com/questions/55645334
复制相似问题