我并不真正关心我的应用程序的性能,所以我没有费心检查它的效率。它基于冒泡排序,所以我的猜测是~O(N^2)。
也许这很复杂,但基本上下面的工作方式是:
- 提供 dict_swap_index 一个嵌套字典和一个列表。列表的格式应为 [i,j,k]。长度应该是字典的深度。每个元素对应于您要将每个元素移动到的位置。例如[2,0,1] 表示将元素 0 移动到位置 2,元素 1 移动到位置 0,元素 2 移动到位置 1。
- 此函数对订单列表和 dict_ 执行冒泡排序,调用 deep_swap 交换订单列表中正在交换的字典级别
- deep_swap 递归调用自身以查找提供的级别并返回已重新排序的字典
- 调用 swap_two_level_dict 来交换字典中的任意两个级别。
本质上,这个想法是对字典执行冒泡排序,而不是交换字典中的列表中的元素。
from collections import defaultdict
def dict_swap_index(dict_, order):
for pas_no in range(len(order)-1,0,-1):
for i in range(pas_no):
if order[i] > order[i+1]:
temp = order[i]
order[i] = order[i+1]
order[i+1] = temp
dict_ = deep_swap(dict_, i)
return dict_, order
def deep_swap(dict_, level):
dict_ = deepcopy(dict_)
if level==0:
dict_ = swap_two_level_dict(dict_)
else:
for key in dict_:
dict_[key] = deep_swap(dict_[key], level-1)
return dict_
def swap_two_level_dict(a):
b = defaultdict(dict)
for key1, value1 in a.items():
for key2, value2 in value1.items():
b[key2].update({key1: value2})
return b
例如
test_dict = {'a': {'c': {'e':0, 'f':1}, 'd': {'e':2,'f':3}}, 'b': {'c': {'g':4,'h':5}, 'd': {'j':6,'k':7}}}
result = dict_swap_index(test_dict, [2,0,1])
result
(defaultdict(dict,
{'c': defaultdict(dict,
{'e': {'a': 0},
'f': {'a': 1},
'g': {'b': 4},
'h': {'b': 5}}),
'd': defaultdict(dict,
{'e': {'a': 2},
'f': {'a': 3},
'j': {'b': 6},
'k': {'b': 7}})}),
[0, 1, 2])