2015-08-18 101 views
3

我有一個字典,其中每個關鍵字都是值的元組,我想使用sorted()方法對我元組的第一個元素上的字典進行排序。我的代碼如下所示:如何對關鍵字(元組)的第一個元素進行字典排序

def mapData(header_list, dict_obj): 
    master_dict = {} 
    client_section_list = [] 
    for element in header_list: 
     for row in dict_obj: 
      if (row['PEOPLE_ID'], row['DON_DATE']) == element: 
       client_section_list.append(row) 
     element = list(element) 
     element_list = [client_section_list[0]['DEDUCT_AMT'], 
        client_section_list[0]['ND_AMT'], 
        client_section_list[0]['DEDUCT_YTD'], 
        client_section_list[0]['NONDEDUCT_YTD'] 
        ] 
     try: 
      element_list.append((float(client_section_list[0]['DEDUCT_YTD']) + 
           float(client_section_list[0]['NONDEDUCT_YTD']) 
           )) 
     except ValueError: 
      pass 

    element.extend(element_list) 
    element = tuple(element) 
    master_dict[element] = client_section_list 
    client_section_list = [] 
return sorted(master_dict, key=lambda key: key[master_dict[(1)]] 

最後一行是我試圖找到排序它的方法。我的元組看起來是這樣的:

(312178078,6/22/15,25,0,25,0,25.0) 
+1

你的代碼有什麼問題? –

+4

如果鍵是元組,則默認情況下該字典將按這些元組的第一個元素進行排序。但是如果你需要提供一個關鍵函數,試試'lambda key:key [0]'。最後,請注意'sorted(some_dict)'將按照排序順序返回keys_,而不是整個字典,即您將丟失值! –

+1

如果您的目標是保留整個字典結構,您將希望在'sorted'函數中使用'dict.items()'。 'return sorted(master_dict.items(),key = lambda key:key [0] [0])'應該做你想做的事。 – cziemba

回答

3

不完全確定你正在嘗試做什麼,特別是那個函數應該返回什麼。我假設你想返回按鍵元組中第一個元素排序的字典。

爲此,有兩點需要注意:

  1. 元組是通過他們的第一個元素(如果這些是相同的,然後通過第二,等等),所以排序默認不需要特殊的按鍵功能
  2. 常規字典是無序的,即它們不能以任何順序永久排序;你可以在他們的項目作爲一個列表只進行排序,或使用列表創建OrderedDict代替

一些小例子:

>>> d = {(2,4): 1, (1,3): 2, (1,2): 3, (3,1): 4} 
>>> sorted(d) 
[(1, 2), (1, 3), (2, 4), (3, 1)] 
>>> sorted(d.items()) 
[((1, 2), 3), ((1, 3), 2), ((2, 4), 1), ((3, 1), 4)] 
>>> collections.OrderedDict(sorted(d.items())) 
OrderedDict([((1, 2), 3), ((1, 3), 2), ((2, 4), 1), ((3, 1), 4)]) 

在你的情況,你可能想這一點:

return collections.OrderedDict(sorted(master_dict.items())) 
2

正如@tobias_k提到,sorted各種各樣的元組由它的元素與優先級遞減,例如如果你拿一個元組(a, b, c)最高的排序優先級去a,然後去b等(默認sorted使用對象的比較方法,這是如何tuple比較工作)。所以sorted(master_dict)是你所需要的,如果你想進行排序鍵的列表,但我相信你真的要離開你需要指定排序key

sorted(master_dict.items(), key=lambda key: key[0]) 

dict.items形式(key, value)所以這裏的回報元組。

+1

只有部分正確。如果你對'dict.items()'進行排序,默認情況下它將按照元組中的第一個元素進行排序,即不提供鍵功能,dict-entries如'((k1,k2,...),( v1,v2,...))'將按k1排序,然後按k2,...,然後按v1,v2,....等 –

+1

@tobias_k這就是爲什麼我提供'key'函數'dict.items'部分 –

+1

但它沒有任何作用。如果'key'是一個元組,除了'lambda key:key [0]'與默認的排序順序相同,只是在第一個元素在相同的情況下沒有平局(但是這永遠不可能是無論如何,因爲鑰匙是唯一的)。 –

相關問題