一个列表,字典嵌套字典,然后想根据最内层字典中的一个 key 排序,有什么优雅的写法么? 求大佬指点

2020-12-05 11:48:57 +08:00
 dwadewyp

Python, 有一个列表 rd, 每个元素是一个字典, 每个字典的 value 还是一个字典(字典套字典); 要求如下: 根据最内层嵌套的字典的一个 key:is_analysis 从小到大排序,并返回不包含列表中每个元素中的 key 值

比如: 输入 ``` rd = [ {100: {"id": 1, "name": "wade", "code": "abc", "is_analysis": 7}}, {101: {"id": 2, "name": "lebron", "code": "abc", "is_analysis": 3}}, {102: {"id": 3, "name": "cp3", "code": "abc", "is_analysis": 5}}, {104: {"id": 4, "name": "melo", "code": "abc", "is_analysis": 0}}]

输出:
	[{'id': 4, 'name': 'melo', 'code': 'abc', 'is_analysis': 0},
     {'id': 2, 'name': 'lebron', 'code': 'abc', 'is_analysis': 3},
     {'id': 3, 'name': 'cp3', 'code': 'abc', 'is_analysis': 5},
     {'id': 1, 'name': 'wade', 'code': 'abc', 'is_analysis': 7}]
2284 次点击
所在节点    Python
9 条回复
JCZ2MkKb5S8ZX9pq
2020-12-05 12:03:17 +08:00
sorted list d.values() lambda v:v['isanalysis']
就这几个拼一下就行 懒得试了
l4ever
2020-12-05 15:14:24 +08:00
一楼不厚道, 小花花给我.


```
rd = [ {100: {"id": 1, "name": "wade", "code": "abc", "is_analysis": 7}}, {101: {"id": 2, "name": "lebron", "code": "abc", "is_analysis": 3}}, {102: {"id": 3, "name": "cp3", "code": "abc", "is_analysis": 5}}, {104: {"id": 4, "name": "melo", "code": "abc", "is_analysis": 0}}]
rd.sort(key=lambda i: list(i.values())[0].get('is_analysis', 0))
print(rd)
```
l4ever
2020-12-05 15:20:26 +08:00
对不起, 没审题. 修改了一下

```
rd = [{100: {"id": 1, "name": "wade", "code": "abc", "is_analysis": 7}}, {101: {"id": 2, "name": "lebron", "code": "abc", "is_analysis": 3}}, {102: {"id": 3, "name": "cp3", "code": "abc", "is_analysis": 5}}, {104: {"id": 4, "name": "melo", "code": "abc", "is_analysis": 0}}]

# 取 list 下的 dict 下的第一个值, 重新组成 list
rd = list(map(lambda x:list(x.values())[0],rd))

# 根据 list 下的 dict 某个值排序
rd.sort(key=lambda i:i.get('is_analysis', 0))
print(rd)

```
imn1
2020-12-05 15:30:18 +08:00
这题昨天问过?我健忘了?
aijam
2020-12-05 16:39:56 +08:00
sorted((y for x in rd for y in x.values()), key = lambda x: x['is_analysis'])
liuxingdeyu
2020-12-05 16:57:44 +08:00
最优雅的不是写到一行里,是写的清清楚楚简简单单,让下一个人能看的舒舒服服
teekgeek
2020-12-05 17:58:33 +08:00
列表里面套两层字典又要做排序太坑爹 可以的话 最好是一层字典
排序的时候我把你的两层字典改成了一层
排序后的数据 是重新生成的与原来结构相同的数据
同时可以指定以内层字典的某个个 k 排序

```
rd = [
{100: {"id": 1, "name": "wade", "code": "abc", "is_analysis": 7}},
{101: {"id": 2, "name": "lebron", "code": "abc", "is_analysis": 3}},
{102: {"id": 3, "name": "cp3", "code": "abc", "is_analysis": 5}},
{104: {"id": 4, "name": "melo", "code": "abc", "is_analysis": 0}}]

new_rd=[{**v,'father_id':k} for i in rd for k,v in i.items()]

def get_sort_rule(sort_k='id'):

def sort_rule(rd_item:dict):
return rd_item.get(sort_k,0)

return sort_rule


new_rd.sort(key=get_sort_rule('is_analysis'))

sorted_rd=[{i.pop('father_id'):i} for i in new_rd]
print(sorted_rd)
```
no1xsyzy
2020-12-05 21:11:21 +08:00
你是不是问过一遍这个问题……
你的问题没描述清楚;但如果你把你的问题描述清楚,那就是代码了。
「编程是一种古老艺术的重新表达,这种古老艺术的名字叫做“思考”」
dwadewyp
2020-12-07 12:28:33 +08:00
@no1xsyzy 问过一遍 不过之前描述的不清楚 所以重新描述了一遍

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/732383

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX