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,现在我明白你的意思了。事实上,它确实有一点微优化的效果。