[英]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
)子樹; 結果如下:
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.