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:谢谢你的评论、时间和建议,我将用你宝贵的建议来改进自己。:谢谢你提供有关词典准备的重要信息。我一定会试试这个方法。