V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
dwadewyp
V2EX  ›  Python

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

  •  
  •   dwadewyp · 2020-12-05 11:48:57 +08:00 · 2369 次点击
    这是一个创建于 1452 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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}]
    
    9 条回复    2020-12-07 12:28:33 +08:00
    JCZ2MkKb5S8ZX9pq
        1
    JCZ2MkKb5S8ZX9pq  
       2020-12-05 12:03:17 +08:00
    sorted list d.values() lambda v:v['isanalysis']
    就这几个拼一下就行 懒得试了
    l4ever
        2
    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
        3
    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
        4
    imn1  
       2020-12-05 15:30:18 +08:00
    这题昨天问过?我健忘了?
    aijam
        5
    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
        6
    liuxingdeyu  
       2020-12-05 16:57:44 +08:00
    最优雅的不是写到一行里,是写的清清楚楚简简单单,让下一个人能看的舒舒服服
    teekgeek
        7
    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
        8
    no1xsyzy  
       2020-12-05 21:11:21 +08:00
    你是不是问过一遍这个问题……
    你的问题没描述清楚;但如果你把你的问题描述清楚,那就是代码了。
    「编程是一种古老艺术的重新表达,这种古老艺术的名字叫做“思考”」
    dwadewyp
        9
    dwadewyp  
    OP
       2020-12-07 12:28:33 +08:00
    @no1xsyzy 问过一遍 不过之前描述的不清楚 所以重新描述了一遍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:36 · PVG 22:36 · LAX 06:36 · JFK 09:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.