使用KeyError中的嵌套for循环fresult从嵌套字典中检索项目

时间:2019-04-16 06:50:32

标签: python python-3.x for-loop

我需要系统地访问嵌套在字典第3级列表中的字典,像这样:

responses = {'1': {'responses': [{1st dict to be retrieved}, {2nd dict to be retrieved}, ...]},
             '2': {'responses': [{1st dict to be retrieved}, {2nd dict to be retrieved}, ...]}, ...}

我需要取消嵌套并将这些嵌套的dict转换为数据帧,因此最终结果应如下所示:

responses = {'1': df1,
             '2': df2, ...}

为了实现这一点,我构建了一个for循环,以便循环访问第一级上的所有键。在该循环中,我正在使用另一个循环将嵌套字典中的每个项目提取到名为responses_df的新空列表中:

responses_dict = {}

for key in responses.keys():
    for item in responses[key]['responses']:
        responses_dict[key].update(item)

但是,我得到了

KeyError: '1'

如果我在字典中的某个键上单独使用它,则内部循环会起作用,但这并不能真正帮助我,因为数据来自API,并且必须在生产中每隔几分钟进行动态更新。

将结果转换为数据帧的nex循环如下所示:

for key in responses_dict:
     responses_df[key] = pd.DataFrame.from_dict(responses_dict[key], orient='index')

但是自从第一次操作失败以来,我还没有尝试过。

4 个答案:

答案 0 :(得分:1)

尝试一下:

from collections import defaultdict      

responses_dict = defaultdict(dict) # instead of {}

然后您的代码即可使用。

答案 1 :(得分:0)

实际上this.application = this.application.splice(i, 1); 的地方responses_dict[key]不存在。

因此,当您简单地执行key=1时,会遇到相同的错误,print(responses_dict[key])不是该1的键,并且dict并未得到应有的使用。 / p>

尝试以下语法:

update

答案 2 :(得分:0)

我更喜欢在更新字典时使用字典。

如果使用现有密钥进行更新,则该密钥的值将被更新。 如果您使用新的键值对更新,该对将被添加到该字典中。

>>>d1 = {1: 10, 2:20}
>>>d1.update({1:20})
>>>d1
>>>{1: 20, 2:20}

>>>d1.update({3:30})
>>>d1
>>>{1: 20, 2:20, 3:30}

尝试通过以下方式修正您的电话线路:

responses_dict = {}
for key in responses.keys():
    for item in responses[key]['responses']:
        responses_dict.update({key: item})

因此,基本上,使用字典来更新字典,使其更具可读性和简便性。

答案 3 :(得分:0)

尝试一下:

responses = {'1': {'responses': [{'a': 1, 'b': 2}, {'c': 3, 'd': 4}]},
             '2': {'responses': [{'e': 5}, {'f': 6}]}}

result = {k: pd.DataFrame(chain.from_iterable(v['responses'])) for k, v in responses.items()}

for df in result.values():
    print(df, end='\n\n')

输出:

   0
0  a
1  b
2  c
3  d

   0
0  e
1  f