use*_*540 6 python sorting dictionary list
让我们考虑一个字典:
sample_dict={1:'r099',2:'g444',3:'t555',4:'f444',5:'h666'}
Run Code Online (Sandbox Code Playgroud)
我想按包含我想要的字典键顺序的列表指定的顺序对该字典重新排序。让我们说所需的订单清单是:
desired_order_list=[5,2,4,3,1]
Run Code Online (Sandbox Code Playgroud)
因此,我希望我的字典显示如下:
{5:'h666',2:'g444',4:'f444',3:'t555',1:'r099'}
Run Code Online (Sandbox Code Playgroud)
如果我可以得到一个很好的值列表。意思是,结果可能是这样的:
['h666','g444','f444','t555','r099']
Run Code Online (Sandbox Code Playgroud)
如何以最简单的方式实现这一目标?
Fra*_*anc 18
Python 3.6+ 的答案
Guido 保证字典将从 Python 3.7 开始订购,并且它们已经作为 3.6 中的实验性功能。答案已经以Fastest way to sort a python 3.7+ dictionary 进行了扩展。
在这种情况下,基于 中包含的项目使用简单的字典理解构建一个新的 dictdesired_order_list就可以了。
sample_dict = {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
print(sample_dict)
>>> {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
desired_order_list = [5, 2, 4, 3, 1]
reordered_dict = {k: sample_dict[k] for k in desired_order_list}
print(reordered_dict)
>>> {5: 'h666', 2: 'g444', 4: 'f444', 3: 't555', 1: 'r099'}
Run Code Online (Sandbox Code Playgroud)
如果您使用OrderedDict,则可以
for key in [5,2,4,3,1]:
my_ordered_dict[key] = my_ordered_dict.pop(key)
Run Code Online (Sandbox Code Playgroud)
这会按照您想要的顺序重新插入顺序字典中的所有内容,以便以后可以执行
my_ordered_dict.values()
Run Code Online (Sandbox Code Playgroud)
并获取您在问题中建议的列表。
如果将重新插入包含在中try: ...; except KeyError: pass,OrderedDict即使您列表中的所有键都不存在,也可以重新排序。
现有的答案不仅仅涵盖了问题,除非在列表不完整的特殊情况下,我们希望保留所有值,将所有其余的留在最后:然后,在创建字典后,用旧的字典更新它以添加缺失值:
sample_dict = {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
print(reordered_dict)
# {1: 'r099', 2: 'g444', 3: 't555', 4: 'f444', 5: 'h666'}
desired_order_list = [5, 2 ]
reordered_dict = {k: sample_dict[k] for k in desired_order_list}
print(reordered_dict)
# {5: 'h666', 2: 'g444'}
reordered_dict.update(sample_dict)
print(reordered_dict)
# {5: 'h666', 2: 'g444', 1: 'r099', 3: 't555', 4: 'f444'}
Run Code Online (Sandbox Code Playgroud)