簡體   English   中英

從列表創建基於SEQUENCE的字典

[英]Create SEQUENCE based dictionary from list

我有這樣的字典清單,

我正在嘗試從清單中准備字典,

清單是這樣的

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_line_id,值來自sale_line_id, 這里是4 sale_line id 和相應的值。

類別“ B”的內部字典格式正確,但是問題在於如果“ A”表示錯誤內部字典

UPDATE2


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個字典在循環中形成。 唯一的不同是2個字典類別“ A”和2個字典類別“ B”

您想達到的目標對我來說還不清楚。 但是,據我了解,您希望按照預定義的組列表將字典列表轉換為樹(如果您有多個根,則為森林)。 這些組從根到葉是有序的:

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

對於每個字典(即業務對象的表示形式),從根開始,並遵循以下路徑:

  • 在路徑的最后一個元素之前,獲取或創建( 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_path不是唯一ID,則獲取或創建葉子(列表)並附加當前字典: e.setdefault(d[last_path], []).append(d)代替e[d[last_path]] = d `

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM