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
swordspoet
V2EX  ›  Python

求解一道关于列表和字典 Python 问题

  •  
  •   swordspoet · 2018-11-07 23:06:17 +08:00 · 1474 次点击
    这是一个创建于 1988 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原始数据是:

    data = [{'a':10,'b':100}, {'a':10,'b':200}, 
            {'a':20,'b':500}, {'a':20,'b':400}, 
            {'a':30,'b':400}]
    

    排序后是:

    data = [[{'a':10,'b':100}, {'a':10,'b':200}], 
            [{'a':20,'b':500}, {'a':20,'b':400}], 
            [{'a':30,'b':400}]]
    
    第 1 条附言  ·  2018-11-09 09:10:21 +08:00
    谢谢,8 楼给出的答案是最简洁的,还谢谢其他同学的解答和批评。
    jdhao
        1
    jdhao  
       2018-11-07 23:48:11 +08:00   ❤️ 2
    看到没人回复,我来说一下。
    必须指出,你问问题的方式很业余,你的排序依据能写清楚吗,不写清楚,让别人怎么回答你?如果你自己连问问题都不想费功夫,不把问题写的清楚易懂,没有人愿意费功夫回答你的问题。

    另外,你做了什么努力,你去 google 了吗,能不能找到现成的答案?或者能不能找到类似的问题和解答?问问题之前要让人看到你的努力,你做了什么?在哪里卡住了?具体遇到了什么解决不了的东西,而不是什么不说,就指着别人给你提供一个现成的代码,这是不好的习惯。

    像你这样的问题,在 stackoverflow 上立马遭到 downvote,甚至可能被关闭,因为你的问题丝毫不符合好问题的标准,建议你读一下 stackoverflow 的如何提问的指导 (地址是 https://stackoverflow.com/help/mcve ),另外这篇 what have you tried ( https://mattgemmell.com/what-have-you-tried/) 也建议你读一下。
    ltoddy
        2
    ltoddy  
       2018-11-07 23:49:16 +08:00 via Android
    @jdhao 我都看懂他想问啥……
    jdhao
        3
    jdhao  
       2018-11-07 23:55:21 +08:00
    @ltoddy,我也知道,但是这样敷衍潦草的问题,我觉得不用回答,我是想强调这点。
    jdhao
        4
    jdhao  
       2018-11-07 23:56:55 +08:00
    @ltoddy,主要是想说明如何提问,才能得到有效的回答。
    necomancer
        5
    necomancer  
       2018-11-08 00:06:56 +08:00   ❤️ 1
    t = sorted(data, key=(lambda x : (x['a'], x['b'])))
    ret = [[]]
    for prv, nxt in zip(t[:-1], t[1:]):
    ....tmp = ret[-1]
    ....tmp.append(prv)
    ....if prv['a']!=nxt['a']:
    ........ret.append([])
    tmp = ret[-1]
    tmp.append(t[-1])
    leavan
        6
    leavan  
       2018-11-08 00:17:42 +08:00
    很简单啊,一行
    print(sorted(data, cmp=lambda x, y: x['a'] < y['a'] if(x['a'] != y['a']) else x['b'] < y['b']))
    leavan
        7
    leavan  
       2018-11-08 00:32:22 +08:00
    emmm..好像审错题了,那就加一行
    s_data = sorted(data, cmp=lambda x, y: x['a'] < y['a'] if(x['a'] != y['a']) else x['b'] < y['b'])
    res = [s_data[i: (i+1)] for i in range((len(s_data) + 1) / 2)]
    print(res)
    AlisaDestiny
        8
    AlisaDestiny  
       2018-11-08 00:38:22 +08:00   ❤️ 1
    ```python
    from itertools import groupby
    print([list(v) for k,v in groupby(data,lambda x:x['a'])])
    ```
    lijun1993
        9
    lijun1993  
       2018-11-08 11:00:37 +08:00
    data.sort(key = lambda x:(x['a'],x['b']))

    一行搞定,就是这么简单~
    xpresslink
        10
    xpresslink  
       2018-11-08 12:24:47 +08:00   ❤️ 1
    >>> data = [{'a':10,'b':100}, {'a':10,'b':200},
    {'a':20,'b':500}, {'a':20,'b':400},
    {'a':30,'b':400}]
    >>> from itertools import groupby
    >>> [list(g) for _,g in groupby(data, lambda x:x['a'])]
    [[{'a': 10, 'b': 100}, {'a': 10, 'b': 200}], [{'a': 20, 'b': 500}, {'a': 20, 'b': 400}], [{'a': 30, 'b': 400}]]
    >>>
    Gakho
        11
    Gakho  
       2018-11-08 17:43:38 +08:00
    @lijun1993 #9 老哥没有分组吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5331 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 08:48 · PVG 16:48 · LAX 01:48 · JFK 04:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.