代码之家  ›  专栏  ›  技术社区  ›  Mormoran

将字典列表拆分为常用元素的字典

  •  3
  • Mormoran  · 技术社区  · 6 年前

    这个问题有点难以用标题来解释。

    dict_list = [{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},
                 {"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},
                 {"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},
                 {"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},
                 {"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},
                 {"PROCESS": "Etch"},{"PROCESS": "Etch"}]
    

    基本上,如果我循环 dict_list ,逐行打印每个“进程”,如下所示:

    >>"Etch"
    >>"Etch"
    >>"Etch"
    >>"Etch"
    >>"Depo"
    >>"Depo"
    >>"Depo"
    >>"Depo"
    >>"Etch"
    >>"Etch"
    >>"Etch"
    >>"Etch"
    >>"Depo"
    >>"Depo"
    >>"Depo"
    >>"Depo"
    

    在这个例子中,我有4个“runs”字典,每个字典都有4个字典列表。

    我需要把它们分类成列表,然后再分类成这样的字典:

    new_dict_list = {
        "run 1": [{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"}],
        "run 2": [{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"}],
        "run 3": [{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"}]
    }
    

    可能是这样的:

    • 在每本字典上迭代

    • 把第一本字典放在一个列表里, 把这个单子编入一本新字典(我们称之为跑步)

    • 在下一次迭代中,如果dictionary[“process”]相同,则存储它 在同一个列表和同一个字典中

    • 如果字典[“进程”]更改,则将当前字典存储在 新列表,然后放入新词典

    我只是不知道如何把它放到python逻辑中。我对这件事还不太熟悉。

    这就是我目前所拥有的:

    prev_process = ""
    counter = 0
    new_dict_list = {}
    
    for dictionary in dict_list:
      if dictionary["PROCESS"] != prev_process:
        counter += 1
        prev_process = dictionary["PROCESS"]
      new_dict_list["run " + counter] = dictionary
    

    我觉得应该有一个while循环,“虽然dictionary[“process”]保持不变,但我不知道如何将其放入python中,或者如何中断(因为如果我像现在这样检查,条件总是正确的)。

    1 回复  |  直到 6 年前
        1
  •  4
  •   Ajax1234    6 年前

    你可以用 itertools.groupby :

    import itertools
    dict_list = [{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Depo"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"},{"PROCESS": "Etch"}]
    new_d = {'run {}'.format(i):list(b) for i, [_, b] in enumerate(itertools.groupby(dict_list, key=lambda x:x["PROCESS"]), 1)}
    

    输出:

    {'run 1': [{'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}], 
     'run 2': [{'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}, {'PROCESS': 'Depo'}], 
     'run 3': [{'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}, {'PROCESS': 'Etch'}]
    }
    

    itertools.groupby网站 基于单个键对数据进行分类。在本例中,数据围绕 'PROCESS' 'run {number}' enumerate 用于以干净的方式跟踪当前迭代索引。