我有一本字典看起来像这样:
nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"},
'dictB': None,
'dictC': None, }
每个字典都可以填充(如dictA
(或具有None
值。
我想为每个词典创建一个新列表,以总结我可以获得的重要信息。
非空字典的伪代码如下所示:
list_dict_A= [nested_dict["dictA"]["text"], nested_dict["dictA"]["confidence"]]
如果字典None
,那么我想创建以下列表
list_dict_B=[0, 0]
因此,在本例中,预期结果将是具有以下值的 3 个列表:
list_dict_A=["ok", "lol"]
list_dict_B=[0, 0]
list_dict_C=[0, 0]
您可以使用字典理解来做到这一点:
nested_dict = {'dictA': {'text': "ok", 'useleskey': 'useles_value', 'confidence': "lol"},
'dictB': None, 'dictC': None, }
lists = {f"list_{k}": [v["text"], v["confidence"]] if v else [0, 0] for k, v in
nested_dict.items()}
print(lists["list_dictA"], lists["list_dictB"], lists["list_dictC"])
# output: ['ok', 'lol'] [0, 0] [0, 0]
由于要创建新变量,因此必须分配给globals()
.
这是为此字典执行此操作的一种方法:
for k, v in nested_dict.items():
var_name = f"list_{k}"
if v:
globals()[var_name] = [v.get("text", 0), v.get("confidence", 0)]
else:
globals()[var_name] = [0, 0]
print (var_name) # just show the var name. Not needed.
print(list_dictA)
==> ['ok', 'lol']
print(list_dictB)
==> [0, 0
这可以通过python的列表理解非常有效地完成:
nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"},
'dictB': None,
'dictC': None, }
res = [[i['text'], i['confidence']] if i else [0, 0] for i in nested_dict.values()]
In [16]: res
Out[16]: [['ok', 'lol'], [0, 0], [0, 0]]
以下是使用字典理解的方法:
nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"},
'dictB': None,
'dictC': None, }
list_dict = {f'list_dict_{k[-1]}':[v[f] for f in v.keys() if f in ['text','confidence']] if v else [0,0] for k,v in nested_dict.items()}
print(list_dict)
输出:
{'list_dict_A': ['ok', 'lol'], 'list_dict_B': [0, 0], 'list_dict_C': [0, 0]}
既然问题提到了熊猫,我建议这样一行:
pd.DataFrame(nested_dict).T.fillna(0).assign(info=lambda df: df[["text", "confidence"]].agg(list, axis=1))
Out:
confidence text useleskey info
dictA lol ok useles_value [ok, lol]
dictB 0 0 0 [0, 0]
dictC 0 0 0 [0, 0]