我的数据如下:
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}]}
答案 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}]}