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

2018-11-07 23:06:17 +08:00
 swordspoet

原始数据是:

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}]]
1480 次点击
所在节点    Python
11 条回复
jdhao
2018-11-07 23:48:11 +08:00
看到没人回复,我来说一下。
必须指出,你问问题的方式很业余,你的排序依据能写清楚吗,不写清楚,让别人怎么回答你?如果你自己连问问题都不想费功夫,不把问题写的清楚易懂,没有人愿意费功夫回答你的问题。

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

像你这样的问题,在 stackoverflow 上立马遭到 downvote,甚至可能被关闭,因为你的问题丝毫不符合好问题的标准,建议你读一下 stackoverflow 的如何提问的指导 (地址是 https://stackoverflow.com/help/mcve ),另外这篇 what have you tried ( https://mattgemmell.com/what-have-you-tried/) 也建议你读一下。
ltoddy
2018-11-07 23:49:16 +08:00
@jdhao 我都看懂他想问啥……
jdhao
2018-11-07 23:55:21 +08:00
@ltoddy,我也知道,但是这样敷衍潦草的问题,我觉得不用回答,我是想强调这点。
jdhao
2018-11-07 23:56:55 +08:00
@ltoddy,主要是想说明如何提问,才能得到有效的回答。
necomancer
2018-11-08 00:06:56 +08:00
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
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
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
2018-11-08 00:38:22 +08:00
```python
from itertools import groupby
print([list(v) for k,v in groupby(data,lambda x:x['a'])])
```
lijun1993
2018-11-08 11:00:37 +08:00
data.sort(key = lambda x:(x['a'],x['b']))

一行搞定,就是这么简单~
xpresslink
2018-11-08 12:24:47 +08:00
>>> 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
2018-11-08 17:43:38 +08:00
@lijun1993 #9 老哥没有分组吗

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

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

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

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

© 2021 V2EX