如何在python中对包含字典列表的字典进行排序?

时间:2016-11-26 02:28:53

标签: python sorting

我的数据如下:

int idx = 5;
var elem = linkedList.ElementAt(idx);

基本上我想把字段名称作为输入(' field1',' field2'等)。然后,我的代码应根据' x'对该字段的字典列表(desc order)进行排序。值。但是,我也试图拥有所有其他领域'根据原始排序更新。让我举个例子。

    data = {'field1': [{'id': <some-string>,
                        'x': <number-to-sort-on>}, ...],
            'field2': [{'id': <some-string>,
                        'x': <some-number>}, ...]
            ... }

收到&#39; field1&#39;的输入后,排序操作应将我的数据转换为以下内容:

   data = {'field1': [{'id': 'firstID', 'x': 3}, {'id': 'secondID', 'x': 6}],
           'field2': [{'id': 'firstID', 'x': 4}, {'id': 'secondID', 'x': 1}]}

1 个答案:

答案 0 :(得分:0)

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}]}

类似于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}]}