2016-11-26 116 views
-1

我的數據是這樣的:如何對包含python字典列表的字典進行排序?

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

基本上,我想作爲輸入字段名稱(「字段1」,「字段2」等)。然後,我的代碼應該根據'x'值對該字段的字典列表(desc順序)進行排序。但是,我也試圖根據原始排序更新所有其他「字段」。讓我舉個例子。

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

在接收「FIELD1」的輸入端,一種操作應該變換我的數據,以執行以下操作:

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

回答

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

非常感謝您的回答!我有一個後續問題 - 說,而不是接收單個字段作爲輸入,我給了一個字段列表,並且順序決定了我的排序順序。所以如果我給了['field1','field2'],我會首先根據你的算法對數據進行排序,但是在'field1'值相等的情況下(比如說'x':5),我應該對' field2'值以desc順序排列,此更新應反映在所有其他字段中。有任何想法嗎? – Valkry

+0

在這種情況下,創建'field_value'和'key'元組。例如,像第一個選項一樣:'field_value = zip(data ['field1'],data ['field2']);排序(枚舉(v),鍵= lambda(i,_):(field_value [i] [0] ['x'],field_value [i] [1] ['x']),reverse = True)' – Psidom