Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据键(元组)的第一个元素对字典排序_Python_Python 2.7_Sorting_Dictionary - Fatal编程技术网

Python 如何根据键(元组)的第一个元素对字典排序

Python 如何根据键(元组)的第一个元素对字典排序,python,python-2.7,sorting,dictionary,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['DO

我有一个字典,其中每个键都是一个值元组,我想使用
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)
最后一行是我试图找到排序的方法。我的元组如下所示:

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)

正如@tobias_k所提到的,
排序
按其元素的优先级递减对元组进行排序,例如,如果采用元组
(a,b,c)
排序优先级最高的是
a
,然后是
b
等(默认情况下,
sorted
使用对象的比较方法,这就是
tuple
比较的工作方式)。因此,
sorted(master_dict)
是所有您需要的,如果您想要一个排序键列表,但我相信您确实想要保留值

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

dict.items
返回形式为
(键,值)
的元组,因此这里需要指定排序

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

为此,有两件事需要注意:

  • 默认情况下,元组按其第一个元素排序(如果它们相同,则按第二个元素排序,依此类推),因此不需要特殊的键函数
  • 常规词典是无序的,即它们不能以任何顺序进行永久排序;您只能将它们的项作为列表进行排序,或者使用该列表创建一个
  • 一些最简单的例子:

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

    您的代码有什么问题?如果键是元组,那么默认情况下,dict将按这些元组的第一个元素排序。但是如果您需要提供键函数,请尝试
    lambda key:key[0]
    。最后,请注意
    排序(一些dict)
    将仅按排序顺序返回键,而不是整个dict,即丢失值!如果您的目标是保持整个字典结构,则需要在
    排序的
    函数中使用
    dict.items()
    返回排序(master_dict.items(),key=lambda key:key[0][0])
    应该做你想做的。只是部分正确。如果你排序
    dict.items()
    ,默认情况下,它将再次按元组中的第一个元素排序,也就是说,在不提供键函数的情况下,dict条目如
    ((k1,k2,,(v1,v2,))
    将按k1排序,然后按k2排序,…,然后按v1、v2排序,…@tobias_k这就是为什么我在
    dict.items
    部分中提供了
    key
    函数,但它没有任何效果。如果
    key
    是一个元组,那么
    lambda key:key[0]
    与默认排序顺序相同,只是在同一元素中的第一个元素的情况下不会出现断开连接的情况(但无论如何都不会出现这种情况,因为键是唯一的)。@tobias_k oh,现在我明白你的意思了。事实上,它确实有一点微优化的效果。