求助:Python中按submittedTime值排序字典集合的正确方法
问题
我有这样一组字典数据:
[ {'count': 5, 'leftCount': 5, 'length': '5', 'submittedTime': 1526815239}, {'count': 10, 'leftCount': 10, 'length': '5', 'submittedTime': 1526814198}, {'count': 5, 'leftCount': 5, 'length': '25', 'submittedTime': 1526815326}, {'count': 8, 'leftCount': 8, 'length': '25', 'submittedTime': 1526815326}, {'count': 5, 'leftCount': 5, 'length': '30', 'submittedTime': 1526815239} ]
注:原内容写的是集合,但Python中集合不能包含字典(字典不可哈希),所以这里修正为列表。
我希望按submittedTime这个key对应的值对其排序,尝试用lambda表达式操作后,结果和原数据完全一致,怀疑哪里操作错了,求正确的实现方法。
解决方案
先给你梳理下可能踩的坑:你大概率是忽略了排序函数的返回值,或者用错了数据结构。下面给你两种实用的实现方式:
方式1:使用sorted()函数(推荐,不修改原数据)
sorted()会返回一个全新的排序列表,不会改动原始数据,你需要把这个返回值存到新变量里才能看到效果:
# 先定义你的数据源(修正为列表) data = [ {'count': 5, 'leftCount': 5, 'length': '5', 'submittedTime': 1526815239}, {'count': 10, 'leftCount': 10, 'length': '5', 'submittedTime': 1526814198}, {'count': 5, 'leftCount': 5, 'length': '25', 'submittedTime': 1526815326}, {'count': 8, 'leftCount': 8, 'length': '25', 'submittedTime': 1526815326}, {'count': 5, 'leftCount': 5, 'length': '30', 'submittedTime': 1526815239} ] # 按submittedTime升序排序(从小到大) sorted_data_asc = sorted(data, key=lambda x: x['submittedTime']) # 如果需要降序排序(从大到小),加上reverse=True参数 sorted_data_desc = sorted(data, key=lambda x: x['submittedTime'], reverse=True)
方式2:使用列表的sort()方法(直接修改原数据)
如果你不需要保留原始数据的顺序,可以用列表自带的sort()方法,它会直接在原列表上修改,不需要额外赋值:
# 升序排序 data.sort(key=lambda x: x['submittedTime']) # 降序排序 data.sort(key=lambda x: x['submittedTime'], reverse=True)
补充说明
你之前操作后结果没变化,大概率是这两个原因:
- 误用了集合结构:集合本身是无序的,而且不能存储字典(字典是可变类型,不可哈希),所以你的原始数据肯定是列表,只是输入时写错了。
- 没保存
sorted()的返回值:如果你只写了sorted(data, key=lambda x: x['submittedTime'])但没把结果赋值给变量,原数据当然不会变——因为sorted()不会修改原数据,只会返回新的排序后的列表。
运行上面的代码后,你就能得到按submittedTime排序后的结果了,比如升序的话,submittedTime为1526814198的字典会排在第一个,接着是两个1526815239的项,最后是两个1526815326的项。
内容的提问来源于stack exchange,提问作者Amir ehsan Mohebi
相关产品推荐
相关产品推荐

