【问题标题】:how to convert a dictionary structure to another dictionary in python如何在python中将字典结构转换为另一个字典
【发布时间】:2019-11-17 12:59:10
【问题描述】:

我有下面的字典

#original
data = {
    'cell_0': ['13a'], 'jam_0': ['07-08'], 'model_0': ['SUPERSTAR'], 'output_0': ['10'], 'output_jam_0': [''], 'time_0': [''], 'output_ot_0': [''], 'time_ot_0': [''],
    'cell_1': ['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['20'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': [''],
    'cell_2': ['13c'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['40'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': [''],
    'cell_3': ['13b'], 'jam_3': ['08-09'], 'model_3': ['SUPERSTAR'], 'output_3': ['30'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': [''],
    'cell_4': ['13d'], 'jam_4': ['16-17'], 'model_4': ['SUPERSTAR'], 'output_4': ['40'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': [''],
    'cell_5': ['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': [''],
    'cell_6': ['13d'], 'jam_6': ['17-18'], 'model_6': ['SUPERSTAR'], 'output_6': ['10'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': [''],
    'cell_7': ['13d'], 'jam_7': ['18-19'], 'model_7': ['SUPERSTAR'], 'output_7': ['60'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': [''],
}

我想把我的字典和另一个字典分开。 我希望输出是:

#output
data = {
    1: {'cell_0': ['13a'], 'jam_0': ['07-08'], 'model_0': ['SUPERSTAR'], 'output_0': ['10'], 'output_jam_0': [''], 'time_0': [''], 'output_ot_0': [''], 'time_ot_0': ['']},
    2: {'cell_1': ['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['20'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': ['']},
    3: {'cell_2': ['13c'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['40'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': ['']},
    4: {'cell_3': ['13b'], 'jam_3': ['08-09'], 'model_3': ['SUPERSTAR'], 'output_3': ['30'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': ['']},
    5: {'cell_4': ['13d'], 'jam_4': ['16-17'], 'model_4': ['SUPERSTAR'], 'output_4': ['40'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': ['']},
    6: {'cell_5': ['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': ['']},
    7: {'cell_6': ['13d'], 'jam_6': ['17-18'], 'model_6': ['SUPERSTAR'], 'output_6': ['10'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': ['']},
    8: {'cell_7': ['13d'], 'jam_7': ['18-19'], 'model_7': ['SUPERSTAR'], 'output_7': ['60'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': ['']},
}

如何将输出字典转换为原始字典

#convert to original again
data = {
    'cell_0': ['13a'], 'jam_0': ['07-08'], 'model_0': ['SUPERSTAR'], 'output_0': ['10'], 'output_jam_0': [''], 'time_0': [''], 'output_ot_0': [''], 'time_ot_0': [''],
    'cell_1': ['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['20'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': [''],
    'cell_2': ['13c'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['40'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': [''],
    'cell_3': ['13b'], 'jam_3': ['08-09'], 'model_3': ['SUPERSTAR'], 'output_3': ['30'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': [''],
    'cell_4': ['13d'], 'jam_4': ['16-17'], 'model_4': ['SUPERSTAR'], 'output_4': ['40'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': [''],
    'cell_5': ['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': [''],
    'cell_6': ['13d'], 'jam_6': ['17-18'], 'model_6': ['SUPERSTAR'], 'output_6': ['10'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': [''],
    'cell_7': ['13d'], 'jam_7': ['18-19'], 'model_7': ['SUPERSTAR'], 'output_7': ['60'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': [''],
}

【问题讨论】:

    标签: python python-3.x dictionary key


    【解决方案1】:

    不需要使用库,你可以将原始dict转换为输出dict by

    result_1 = {}
    for k, v in data.items():
        number = int(k[-1])
        if number not in result_1:
            result_1[number] = {}
        result_1[number][k] = v
    

    然后转换回来

    result_2 = {}
    for v in result_1.values():
        result_2.update(v)
    

    【讨论】:

    • 如果数字是两位数怎么办?还要与 OP 的格式相匹配,您应该更改为 number = int(k[-1]) + 1。除了那个不错的答案!
    • 我有 3 位数字。我有错误,Traceback(最近一次调用最后一次):文件“C:/Dev/django_project/untitled/tes_data.py”,第 24 行,在 number = int(k[-1])+1 ValueError:基数为 10 的 int() 的无效文字:'h'
    • 如果超过 1 位,使用 k.split('_')[-1] 代替
    【解决方案2】:

    你可以使用itertools.groupby:

    import itertools, re
    data = {'cell_0': ['13a'], 'jam_0': ['07-08'], 'model_0': ['SUPERSTAR'], 'output_0': ['10'], 'output_jam_0': [''], 'time_0': [''], 'output_ot_0': [''], 'time_ot_0': [''], 'cell_1': ['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['20'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': [''], 'cell_2': ['13c'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['40'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': [''], 'cell_3': ['13b'], 'jam_3': ['08-09'], 'model_3': ['SUPERSTAR'], 'output_3': ['30'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': [''], 'cell_4': ['13d'], 'jam_4': ['16-17'], 'model_4': ['SUPERSTAR'], 'output_4': ['40'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': [''], 'cell_5': ['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': [''], 'cell_6': ['13d'], 'jam_6': ['17-18'], 'model_6': ['SUPERSTAR'], 'output_6': ['10'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': [''], 'cell_7': ['13d'], 'jam_7': ['18-19'], 'model_7': ['SUPERSTAR'], 'output_7': ['60'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': ['']}
    new_data = sorted(data.items(), key=lambda x:int(re.findall('\d+$', x[0])[0]))
    r = {a+1:dict(list(b)) for a, b in itertools.groupby(new_data, key=lambda x:int(re.findall('\d+$', x[0])[0]))}
    

    输出:

    {1: {'cell_0': ['13a'], 'jam_0': ['07-08'], 'model_0': ['SUPERSTAR'], 'output_0': ['10'], 'output_jam_0': [''], 'time_0': [''], 'output_ot_0': [''], 'time_ot_0': ['']}, 
     2: {'cell_1': ['13a'], 'jam_1': ['07-08'], 'model_1': ['SUPERSTAR'], 'output_1': ['20'], 'output_jam_1': [''], 'time_1': [''], 'output_ot_1': [''], 'time_ot_1': ['']}, 
     3: {'cell_2': ['13c'], 'jam_2': ['07-08'], 'model_2': ['SUPERSTAR'], 'output_2': ['40'], 'output_jam_2': [''], 'time_2': [''], 'output_ot_2': [''], 'time_ot_2': ['']}, 
     4: {'cell_3': ['13b'], 'jam_3': ['08-09'], 'model_3': ['SUPERSTAR'], 'output_3': ['30'], 'output_jam_3': [''], 'time_3': [''], 'output_ot_3': [''], 'time_ot_3': ['']}, 
     5: {'cell_4': ['13d'], 'jam_4': ['16-17'], 'model_4': ['SUPERSTAR'], 'output_4': ['40'], 'output_jam_4': [''], 'time_4': [''], 'output_ot_4': [''], 'time_ot_4': ['']}, 
     6: {'cell_5': ['13d'], 'jam_5': ['16-17'], 'model_5': ['SUPERSTAR'], 'output_5': ['40'], 'output_jam_5': [''], 'time_5': [''], 'output_ot_5': [''], 'time_ot_5': ['']},
     7: {'cell_6': ['13d'], 'jam_6': ['17-18'], 'model_6': ['SUPERSTAR'], 'output_6': ['10'], 'output_jam_6': [''], 'time_6': [''], 'output_ot_6': [''], 'time_ot_6': ['']}, 
     8: {'cell_7': ['13d'], 'jam_7': ['18-19'], 'model_7': ['SUPERSTAR'], 'output_7': ['60'], 'output_jam_7': [''], 'time_7': [''], 'output_ot_7': [''], 'time_ot_7': ['']}}
    

    【讨论】:

    • Traceback(最近一次调用最后一次):文件“C:/Dev/django_project/untitled/tes_data.py”,第 30 行,在 new_data = sorted(data_copy.items(), key =lambda x: int(re.findall('\d+$', x[0])[0])) 文件“C:/Dev/django_project/untitled/tes_data.py”,第 30 行,在 new_data = sorted(data_copy.items(), key=lambda x: int(re.findall('\d+$', x[0])[0])) IndexError: list index out of range
    • @rahmatzaki 请发布引发该错误的数据。
    猜你喜欢
    • 2016-09-14
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 2019-09-22
    • 2020-09-21
    • 2013-02-19
    相关资源
    最近更新 更多