是否有一个库可以帮助我完成重新安排嵌套字典级别的任务
例如:从此:
{1:{"A":"i","B":"ii","C":"i"},2:{"B":"i","C":"ii"},3:{"A":"iii"}}
对此:
{"A":{1:"i",3:"iii"},"B":{1:"ii",2:"i"},"C":{1:"i",2:"ii"}}
即3级字典上的前两个级别交换。因此,不是1映射到A和3映射到A,我们有一个映射到1和3。
解决方案应该适用于任意深度,并从一个级别移动到任何其他级别。
答案 0 :(得分:4)
基本上你是把它读成数组并进行转置。实现这一目标的一种简单方法是使用数据分析包Pandas:
将pandas导入为pd
df = pd.DataFrame({1:{"A":"i","B":"ii","C":"i"},2:{"B":"i","C":"ii"},3:{"A":"iii"}})
df.transpose().to_dict()
{'A': {1: 'i', 2: nan, 3: 'iii'},
'B': {1: 'ii', 2: 'i', 3: nan},
'C': {1: 'i', 2: 'ii', 3: nan}}
答案 1 :(得分:4)
>>> d = {1:{"A":"i","B":"ii","C":"i"},2:{"B":"i","C":"ii"},3:{"A":"iii"}}
>>> keys = ['A','B','C']
>>> e = {key:{k:d[k][key] for k in d if key in d[k]} for key in keys}
>>> e
{'C': {1: 'i', 2: 'ii'}, 'B': {1: 'ii', 2: 'i'}, 'A': {1: 'i', 3: 'iii'}}
感谢上帝的理解
答案 2 :(得分:0)
我并不是很在意我的应用程序的性能,因此我没有费心检查它的效率。它基于气泡排序,所以我的猜测是〜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])