在字典的python列表中对值进行排序

时间:2018-07-30 14:21:44

标签: python

我正在根据\ d +:\ d +

格式的关键字对字典列表进行排序

字典列表应具有预期的密钥(年龄)

lst = [
[{'id': 'SOMEDATA_31_30', 'age': '31:30', 'values':0, 'hasdata': False, 'name': u'SOMEDATA'}]
[{'id': 'SOMEDATA1_32_29', 'age': '32:29', 'values':1, 'hasdata': False, 'name': u'SOMEDATA1'}]
[{'id': 'SOMEDATA2_22_20', 'age': '22:20', 'values':3, 'hasdata': False, 'name': u'SOMEDATA2'},{'id': 'SOMEDATA2_28_27', 'age': '28:27', 'values':4, 'hasdata': False, 'name': u'SOMEDATA2'}]
]

因此,当我将整个(lst)传递给compare(function ?!)时,它应该给我一个基于年龄按降序排列的字典列表。

lst = [
    {'id': 'SOMEDATA1_32_29', 'age': '32:29', 'values':1, 'hasdata': False, 'name': u'SOMEDATA1'}
    {'id': 'SOMEDATA_31_30', 'age': '31:30', 'values':0, 'hasdata': False, 'name': u'SOMEDATA'}
    {'id': 'SOMEDATA2_28_27', 'age': '28:27', 'values':4, 'hasdata': False, 'name': u'SOMEDATA2'}
    {'id': 'SOMEDATA2_22_20', 'age': '22:20', 'values':3, 'hasdata': False, 'name': u'SOMEDATA2'}
    ]

我们应该怎么做?谢谢你的时间。

3 个答案:

答案 0 :(得分:1)

使用python内置函数key的{​​{1}}和reverse参数:

sorted()

此打印:

lst = [
{'id': 'SOMEDATA_31_30', 'age': '31:30', 'values':0, 'hasdata': False, 'name': u'SOMEDATA'},
{'id': 'SOMEDATA1_32_29', 'age': '32:29', 'values':1, 'hasdata': False, 'name': u'SOMEDATA1'},
{'id': 'SOMEDATA2_22_20', 'age': '22:20', 'values':3, 'hasdata': False, 'name': u'SOMEDATA2'},
{'id': 'SOMEDATA2_28_27', 'age': '28:27', 'values':4, 'hasdata': False, 'name': u'SOMEDATA2'},
]

import re
from pprint import pprint


pprint( sorted(lst, reverse=True, key=lambda v: [(int(i[0]), int(i[1])) for i in re.findall(r'(\d+):(\d+)', v['age'])]), width=120 )

答案 1 :(得分:1)

您可以使用sorted()

lst = [
{'id': 'SOMEDATA_31_30', 'age': '31:30', 'values':0, 'hasdata': False, 'name': u'SOMEDATA'},
{'id': 'SOMEDATA1_32_29', 'age': '32:29', 'values':1, 'hasdata': False, 'name': u'SOMEDATA1'},
{'id': 'SOMEDATA2_22_20', 'age': '22:20', 'values':3, 'hasdata': False, 'name': u'SOMEDATA2'},
{'id': 'SOMEDATA2_28_27', 'age': '28:27', 'values':4, 'hasdata': False, 'name': u'SOMEDATA2'},
]

newlist = sorted([x[0] for x in lst], key=lambda k: k['age'], reverse=True)

print(newlist)

输出

[{'age': '32:29', 'hasdata': False, 'id': 'SOMEDATA1_32_29','name': 'SOMEDATA1', 'values': 1},
 {'age': '31:30','hasdata': False, 'id': 'SOMEDATA_31_30','name': 'SOMEDATA', 'values': 0},
 {'age': '28:27', 'hasdata': False, 'id': 'SOMEDATA2_28_27','name':'SOMEDATA2','values': 4},
 {'age': '22:20', 'hasdata': False, 'id': 'SOMEDATA2_22_20','name': 'SOMEDATA2','values': 3}]

答案 2 :(得分:0)

使用NumPy,您可以尝试以下操作:

ages = [i['age'] for i in lst]
print (np.array(lst)[np.argsort(ages)[::-1]])

输出

[ {'id': 'SOMEDATA1_32_29', 'age': '32:29', 'values': 1, 'hasdata': False, 'name': 'SOMEDATA1'}
 {'id': 'SOMEDATA_31_30', 'age': '31:30', 'values': 0, 'hasdata': False, 'name': 'SOMEDATA'}
 {'id': 'SOMEDATA2_28_27', 'age': '28:27', 'values': 4, 'hasdata': False, 'name': 'SOMEDATA2'}
 {'id': 'SOMEDATA2_22_20', 'age': '22:20', 'values': 3, 'hasdata': False, 'name': 'SOMEDATA2'}]