在python

时间:2015-10-29 22:39:07

标签: python data-structures

是否有一个库可以帮助我完成重新安排嵌套字典级别的任务

例如:从此:

{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。

解决方案应该适用于任意深度,并从一个级别移动到任何其他级别。

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