Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表创建基于序列的字典_Python_Python 3.x_List_Dictionary - Fatal编程技术网

Python 从列表创建基于序列的字典

Python 从列表创建基于序列的字典,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我有一个这样的字典列表 result = [{'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 'sale_line_id': 34353, 'benefit_name': 'TPA', 'insurance_category_name': 'A', 'benefit_categ_seq': 1}, {'comp_seq': 1, 'benefit_cat

我有一个这样的字典列表

result = [{'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34353, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34354,'benefit_name': 'TPA', 
           'insurance_category_name': 'B', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34355, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1}, 
          {'comp_seq': 1,  'benefit_category_name': 'Standard Benefits',  
           'sale_line_id': 34356, 'insurance_category_name': 'B', 
           'benefit_categ_seq': 1}]
{1: 
    {'Standard Benefits': 
        {1: 
            {'TPA': 
                [{'B': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]}, 

                 {'A': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]},
                    ]
                 }
            }
        }
    }
我正试着从列表中准备一本字典

名单是这样的,

result = [{'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34353, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34354,'benefit_name': 'TPA', 
           'insurance_category_name': 'B', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34355, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1}, 
          {'comp_seq': 1,  'benefit_category_name': 'Standard Benefits',  
           'sale_line_id': 34356, 'insurance_category_name': 'B', 
           'benefit_categ_seq': 1}]
{1: 
    {'Standard Benefits': 
        {1: 
            {'TPA': 
                [{'B': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]}, 

                 {'A': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]},
                    ]
                 }
            }
        }
    }
我在找这样的字典

result = [{'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34353, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34354,'benefit_name': 'TPA', 
           'insurance_category_name': 'B', 'benefit_categ_seq': 1},
          {'comp_seq': 1, 'benefit_category_name': 'Standard Benefits', 
           'sale_line_id': 34355, 'benefit_name': 'TPA',  
           'insurance_category_name': 'A', 'benefit_categ_seq': 1}, 
          {'comp_seq': 1,  'benefit_category_name': 'Standard Benefits',  
           'sale_line_id': 34356, 'insurance_category_name': 'B', 
           'benefit_categ_seq': 1}]
{1: 
    {'Standard Benefits': 
        {1: 
            {'TPA': 
                [{'B': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]}, 

                 {'A': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]},
                    ]
                 }
            }
        }
    }
但事实上,我在我的代码之后得到了这样的字典

{1: 
    {'Standard Benefits': 
        {1: 
            {'TPA': 
                [{'B': 
                    [{34353: [None, True, None, False]},
                     {34354: ['Aafiya', False, None, False]}, 
                     {34355: [None, True, None, False]}, 
                     {34356: ['Aafiya', False, None, False]}]}, 
                 {'A': [}]},
                ]
            }
        }
    }
}
这是我为准备字典而写的代码

cat1= []
for key, value in itertools.groupby(result, key=itemgetter('insurance_category_name')):
    cat1.append(key)
cat = list(set(cat1))
seq_d = {}
seq_sort_res = sorted(result, key=itemgetter('benefit_categ_seq'))
for seq, bc_val in itertools.groupby(seq_sort_res, key=itemgetter('benefit_categ_seq')):
    bc_d = {}
    ben_categ_sort_result = sorted(bc_val, key=itemgetter('benefit_category_name'))
    for bc, bf_val in itertools.groupby(ben_categ_sort_result, key=itemgetter('benefit_category_name')):
        bseq_d = {} 
        benefit_seq = sorted(bf_val, key=itemgetter('comp_seq'))
        for bseq, bseq_val in itertools.groupby(benefit_seq, key=itemgetter('comp_seq')):
            bf_d = {} 
            for bf in bseq_val:
                if bf.get('benefit_name') not in bf_d:
                    bf_d.update({bf.get('benefit_name'): []})
                    for c in cat:
                        if c not in bf_d[bf.get('benefit_name')]:
                           bf_d.get(bf.get('benefit_name')).append({c: []})
                content = []
                vals = ['description', 'is_checked', 'comment', 'highlight']
                for v in vals:
                    content.append(bf.get(v))
                s = {bf.get('sale_line_id'): content} 
                list(bf_d[bf.get('benefit_name')][0].values())[0].append(s)
            bseq_d.update({bseq: bf_d})
        bc_d.update({bc: bseq_d})
    seq_d.update({seq: bc_d})
但是这本字典没有准备好。我认为循环中存在一些问题。请在我的代码中找出问题所在

更新


这个问题背后的逻辑是,我决定创建字典,首先是效益类别序列,然后是效益类别,然后是效益序列,效益如下

在这一好处中,我为类别“a”和“B”添加了一个列表。列表中有一个“a”和“B”的字典。,键是sale\u line\u id,值来自sale\u line\u id,这里是4个sale\u line ids。和相应的值

类别“B”的内部词典格式正确,但如果“A”表示错误,则问题在于内部词典

更新2


来自bseq_val中bf的bf字典:

bf字典是

 {'is_checked': False, 'highlight': False, 'comment': None, 
  'comp_seq': 1, 'description': 'Aafiya', 'benefit_name': 'TPA', 
  'insurance_category_name': 'B', 'benefit_categ_seq': 1,  
  'benefit_category_name': 'Standard Benefits', 'sale_line_id': 34354}
这种类型的4个字典形成循环。
唯一的主要区别是两本词典的“A”类和两本词典的“B”类。

我不清楚您想要实现什么。但是,如果我理解的话,您希望按照预定义的组列表将dict列表转换为树(如果您有多个根,则转换为林)。这些组从根到叶依次排列:

groups = ['benefit_categ_seq', 'benefit_category_name', 'comp_seq', 'insurance_category_name', 'sale_line_id']
您可以使用上面的列表来构建树,而不是硬编码层次结构:

def nest(L, path):
    *init_path, last_path = path # split before the last element
    root = {}
    for d in L:
        e = root # start at the root
        for g in init_path: # follow the path
            e = e.setdefault(d[g], {}) # get or create the subtree
        e[d[last_path]] = d # add the dict to the leaf

    return root
对于每个dict(即业务对象的表示),从根开始,并遵循以下路径:

  • 在路径的最后一个元素之前,获取或创建(
    setdefault
    )子树
  • 当到达路径的最后一个元素(即对象的id)时,附着该对象
结果如下:

from pprint import pprint
pprint (nest(result, groups))
{1: {'Standard Benefits': {1: {'A': {34353: {'benefit_categ_seq': 1,
                                             'benefit_category_name': 'Standard '
                                                                      'Benefits',
                                             'benefit_name': 'TPA',
                                             'comp_seq': 1,
                                             'insurance_category_name': 'A',
                                             'sale_line_id': 34353},
                                     34355: {'benefit_categ_seq': 1,
                                             'benefit_category_name': 'Standard '
                                                                      'Benefits',
                                             'benefit_name': 'TPA',
                                             'comp_seq': 1,
                                             'insurance_category_name': 'A',
                                             'sale_line_id': 34355}},
                               'B': {34354: {'benefit_categ_seq': 1,
                                             'benefit_category_name': 'Standard '
                                                                      'Benefits',
                                             'benefit_name': 'TPA',
                                             'comp_seq': 1,
                                             'insurance_category_name': 'B',
                                             'sale_line_id': 34354},
                                     34356: {'benefit_categ_seq': 1,
                                             'benefit_category_name': 'Standard '
                                                                      'Benefits',
                                             'comp_seq': 1,
                                             'insurance_category_name': 'B',
                                             'sale_line_id': 34356}}}}}}
我知道这不是您需要的确切输出,但可能会有所帮助

如果
last\u path
不是唯一的id,则获取或创建叶(列表)并附加当前目录:
e.setdefault(d[last\u path])。附加(d)
而不是
e[d[last\u path]]=d

`

您能否进一步解释输出字典应该如何从输入列表中编制的逻辑?aafiya从何而来?我在输入数据中没有看到它,这是我们事先“刚刚知道”的吗?@JonKiparsky:“aafiya”来自描述,来自这个语句------content.append(bf.get(v))。bf是包含“description”、“is_checked”作为键和对应项的字典values@aslamsha22我已经花了大约二十分钟看了你的代码,我有两个建议。首先,当您的代码嵌套得很深时,生成函数并给它们命名。其次,当您试图用字典和列表构建数据结构时,请创建一个对象。额外建议:改进变量名。他们应该立即告诉您需要知道的关于变量用途的信息,回顾起来,这对他们来说是不够的。很抱歉,我帮不了你改进这次尝试,祝你下次好运。@JonKiparsky:谢谢你的评论、时间和建议,我将用你宝贵的建议来改进自己。:谢谢你提供有关词典准备的重要信息。我一定会试试这个方法。