如何对包含python词典列表的词典进行排序?
我的数据如下所示:如何对包含python词典列表的词典进行排序?,python,sorting,Python,Sorting,我的数据如下所示: data = {'field1': [{'id': <some-string>, 'x': <number-to-sort-on>}, ...], 'field2': [{'id': <some-string>, 'x': <some-number>}, ...] ... }
data = {'field1': [{'id': <some-string>,
'x': <number-to-sort-on>}, ...],
'field2': [{'id': <some-string>,
'x': <some-number>}, ...]
... }
收到“field1”输入后,排序操作应将我的数据转换为以下内容:
data = {'field1': [{'id': 'secondID', 'x': 6}, {'id': 'firstID', 'x': 3}],
'field2': [{'id': 'secondID', 'x': 1}, {'id': 'firstID', 'x': 4}]}
另一个类似于numpy的argsort()
方法的选项,您可以获得一个索引列表,该列表对与field1
对应的值进行排序,然后使用索引列表对所有其他值进行排序:
field_value = data['field1']
argsort_lst = [i for i, _ in sorted(enumerate(field_value), key=lambda (i,v): v['x'], reverse=True)]
argsort_lst
# [1, 0]
for v in data.values():
v[:] = [v[i] for i in argsort_lst]
data
# {'field1': [{'id': 'secondID', 'x': 6}, {'id': 'firstID', 'x': 3}],
# 'field2': [{'id': 'secondID', 'x': 1}, {'id': 'firstID', 'x': 4}]}
非常感谢你的回答!我有一个后续问题——比如说,不是接收单个字段作为输入,而是给我一个字段列表,并且顺序决定了排序的顺序。因此,如果给我['field1','field2',],我会首先根据您的算法对数据进行排序,但是如果'field1'值相等(假设所有值都有'x':5),我应该按照desc顺序对'field2'值进行排序,并且此更新应该反映在所有其他字段中。有什么想法吗?在这种情况下,创建
字段的值和键的元组。例如,第一个选项类似:field_value=zip(data['field1'],data['field2']);已排序(枚举(v),key=lambda(i,):(字段值[i][0]['x'],字段值[i][1]['x'],反向=True)
field_value = data['field1'] # extract the value for the input field name
for k,v in data.items():
# sort the values for each key based on the values of the extracted fields
sorted_value = sorted(enumerate(v), key=lambda (i, _): field_value[i]['x'], reverse=True)
data[k] = [v[1] for v in sorted_value]
data
# {'field1': [{'id': 'secondID', 'x': 6}, {'id': 'firstID', 'x': 3}],
# 'field2': [{'id': 'secondID', 'x': 1}, {'id': 'firstID', 'x': 4}]}
field_value = data['field1']
argsort_lst = [i for i, _ in sorted(enumerate(field_value), key=lambda (i,v): v['x'], reverse=True)]
argsort_lst
# [1, 0]
for v in data.values():
v[:] = [v[i] for i in argsort_lst]
data
# {'field1': [{'id': 'secondID', 'x': 6}, {'id': 'firstID', 'x': 3}],
# 'field2': [{'id': 'secondID', 'x': 1}, {'id': 'firstID', 'x': 4}]}