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

8

我有一个字典,其中每个键都是一组值的元组。我想使用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
你的代码出了什么问题? - Scott Hunter
5
如果键是元组,则默认情况下该字典将按这些元组的第一个元素进行排序。但是,如果您需要提供关键函数,请尝试使用“lambda key:key [0]”。最后,请注意,“sorted(some_dict)”将只返回已排序键,而不是整个字典,即您会丢失值! - tobias_k
2
如果您的目标是保留整个字典结构,那么在sorted函数中,您需要使用dict.items()return sorted(master_dict.items(), key=lambda key: key[0][0])可以实现您想要的功能。 - cziemba
2个回答

9

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

对此,需要注意以下两点:

  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) 就可以了,但我相信您真正想做的是保留值。
sorted(master_dict.items(), key=lambda key: key[0])

dict.items 返回形如 (key, value) 的元组,因此在这里需要指定排序的 key


1
仅部分正确。如果您对dict.items()排序,它将默认按元组中的第一个元素进行排序,即在不提供键函数的情况下,dict-条目(例如((k1, k2, ...),(v1,v2,...)))将按k1,然后按k2,...,然后按v1,v2等排序。 - tobias_k
1
@tobias_k 这就是为什么我在 dict.items 部分提供 key 函数的原因。 - Eli Korvigo
1
但它没有任何影响。如果key是一个元组,那么lambda key: key[0]与默认排序顺序相同,只是在第一个元素相同时没有打破平局(但这永远不可能发生,因为键是唯一的)。 - tobias_k
1
@tobias_k 噢,现在我明白你的意思了。实际上,这确实对微优化产生了一点影响。 - Eli Korvigo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接