Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何对包含python词典列表的词典进行排序?_Python_Sorting - Fatal编程技术网

如何对包含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}]}