如何在键的第一个元素(元组)上对字典进行排序

时间:2015-08-18 20:08:50

标签: python python-2.7 sorting dictionary

我有一个字典,其中每个键都是一个值元组,我想使用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)

2 个答案:

答案 0 :(得分:3)

不完全确定你要做什么,特别是那个函数应该返回什么。我假设你想要返回按键元组中第一个元素排序的字典。

为此,有两点需要注意:

  1. 默认 按第一个元素排序<(如果它们相同,那么第二个,依此类推),因此不需要特殊的键功能
  2. 常规词典是无序的,即它们不能按任何顺序永久排序;您只能将其项目排序为列表,或使用该列表创建OrderedDict而不是
  3. 一些最小的例子:

    >>> 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()))
    

答案 1 :(得分:2)

正如@tobias_k所提到的,sorted按其优先级递减的元素对元组进行排序,例如如果您使用元组(a, b, c),则最高排序优先级转到a,然后转到b等(默认情况下sorted使用对象的比较方法,这是如何tuple比较有效)。所以如果你想要一个排序键列表,你就可以sorted(master_dict),但我相信你真的想留下值

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

dict.items会返回(key, value)格式的元组,因此您需要指定排序key