【问题标题】:How to sort dictionary on first element of the key (tuple)如何在键的第一个元素(元组)上对字典进行排序
【发布时间】:2015-11-11 22:33:46
【问题描述】:

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

【问题讨论】:

  • 你的代码有什么问题?
  • 如果键是元组,默认情况下字典将按这些元组的第一个元素排序。但如果您需要提供按键功能,请尝试lambda key: key[0]。最后,请注意sorted(some_dict) 将按排序顺序返回仅键,而不是整个字典,即您会丢失值!
  • 如果您的目标是保留整个字典结构,您将希望在sorted 函数中使用dict.items()return sorted(master_dict.items(), key=lambda key: key[0][0]) 应该做你想做的。

标签: python python-2.7 sorting dictionary


【解决方案1】:

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

为此,有两点需要注意:

  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

    【讨论】:

    • 仅部分正确。如果对dict.items()进行排序,默认会再次按元组中的第一个元素排序,即不提供key函数的情况下,((k1, k2, ...), (v1, v2, ...))等dict-entries会按k1排序,那么按 k2, ..., 然后按 v1, v2, .... 等
    • @tobias_k 这就是为什么我在key 部分提供key 函数
    • 但是没有任何作用。如果key 是一个元组,则lambda key: key[0] 与默认排序顺序相同,除非在相同的第一个元素的情况下没有平局(但无论如何都不会出现这种情况,因为键是独一无二)。
    • @tobias_k 哦,现在我明白你的意思了。其实它确实有微优化的小效果。
    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2017-08-21
    • 2022-08-18
    • 2022-06-28
    • 2011-02-07
    • 1970-01-01
    相关资源
    最近更新 更多