Python 字典将“无”替换为嵌套字典中的值

Python 字典将“无”替换为嵌套字典中的值,python,pandas,list,Python,Pandas,List,我有一本这样的字典: nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"}, 'dictB': None, 'dictC': None, } list_dict_A= [nested_dict["dictA"]["text"]

我有一本这样的字典:

nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"},
                'dictB':  None, 
                'dictC':  None, }

list_dict_A= [nested_dict["dictA"]["text"], nested_dict["dictA"]["confidence"]]
每一本字典都可以像格言一样填写,也可以一文不值

我想为每本词典创建一个新列表,以总结我能获得的重要信息

非空字典的伪代码如下所示:

nested_dict = { 'dictA': {'text': "ok",'useleskey':'useles_value','confidence': "lol"},
                'dictB':  None, 
                'dictC':  None, }

list_dict_A= [nested_dict["dictA"]["text"], nested_dict["dictA"]["confidence"]]
如果字典没有,那么我想创建以下列表

list_dict_B=[0, 0]
因此,在本例中,预期结果将是3个具有以下值的列表:

list_dict_A=["ok", "lol"]
list_dict_B=[0, 0]
list_dict_C=[0, 0]

由于要创建新变量,必须将其分配给全局变量

这里有一种方法可以为这本词典做到这一点:

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

您可以使用dict理解来完成:

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]
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)

通过对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, }

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]
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.DataFramenested_dict.T.fillna0.assigninfo=lambda-df:df[[text,confidence]]。aggrest,axis=1 输出: 信任文本useleskey信息 dictA lol ok useles_值[ok,lol] dictb0[0,0] dictc0[0,0]
这可以通过迭代嵌套的_dict键来轻松完成,并基于该值将相应的结果添加到列表中。