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

如何根据值将Python字典拆分为多个字典

  •  0
  • Qubix  · 技术社区  · 7 年前

    我有一本类似的字典:

    {'A': [0, 2, 5],
     'B': [1],
     'C': [3, 6, 9],
     'D': [4, 7, 10],
     'E': [8, 11, 13],
     'F': [12]}
    

    我想根据值列表中连续元素的不同,将其拆分为多个字典(比如2)。例如,上面:

    dict_2 = {'A': [0, 2],
         'E': [11, 13]}
    
    dict_3 = {'A': [2, 5],
         'C': [3, 6, 9],
         'D': [4, 7, 10],
         'E': [8, 11]}
    

    所以我比较每个列表中的连续值,如果 (i+1) - i 是2,我把它放进去了 dict_2 ,如果是3,我就把它放进去 dict_3 . 我忽略那些每个列表只有一个元素或者差异不是2或3的元素。

    我正在尝试一种相当繁琐的方法:

    def construct_dicts(init_dict, no_jumps=[2,3]):
        dct_2, dct_3 = {}, {}
        for key in init_dict.keys():
            for index in range(len(init_dict[key])):
                if init_dict[key][index+1] - init_dict[key][index] = no_jumps[0]:
                    dct_2[key] = [index, index + 1]
                elif init_dict[key][index+1] - init_dict[key][index] = no_jumps[1]:
                    dct_3[key] = [index, index + 1]
    

    然而,这是繁琐和丑陋的(还不起作用)。有没有比这更像蟒蛇的方法?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Mazdak    7 年前

    collections.defaultdict

    def categorize_dicts(dictionary):
        dfd = defaultdict(defaultdict)
        for k, v in d.items():
            for i,j in zip(v, v[1:]):
                dfd[j-i].setdefault(k,[]).extend((i, j))
        return dfd  
    

    In [28]: d = {'A': [0, 2, 5],
            ...:  'B': [1],
            ...:  'C': [3, 6, 9],
            ...:  'D': [4, 7, 10],
            ...:  'E': [8, 11, 13],
            ...:  'F': [12, 15, 17],
            ...:  'T': [19]}
            ...:  
    
    In [29]: categorize_dicts(d)
    Out[29]: 
    defaultdict(collections.defaultdict,
                {2: defaultdict(None, {'A': [0, 2], 'E': [11, 13], 'F': [15, 17]}),
                 3: defaultdict(None,
                             {'A': [2, 5],
                              'C': [3, 6, 6, 9],
                              'D': [4, 7, 7, 10],
                              'E': [8, 11],
                              'F': [12, 15]})})
    
        2
  •  1
  •   a_guest    7 年前

    1. for index in range(len(init_dict[key])) index + 1 IndexError
    2. index + 1, index

    dict set list

    from collections import defaultdict
    
    d = {
        'A': [0, 2, 5],
        'B': [1],
        'C': [3, 6, 9],
        'D': [4, 7, 10],
        'E': [8, 11, 13],
        'F': [12]
    }
    diff = defaultdict(lambda: defaultdict(set))
    
    for k, v in d.items():
        for i, j in zip(v, v[1:]):
            diff[j-i][k] |= {i, j}