如何将嵌套字典中的numpy array转list?KeyError: '1'报错求解
嘿,这个问题的根源是你搞混了循环的对象,还有原始字典里的小坑,我来给你理清楚:
首先说报错原因:
你写的内层循环for day in worker里,worker是workersDays的键,也就是字符串'worker1'、'worker2'——所以你遍历的是字符串的每个字符(比如'w'、'o'、'r'...直到'1'),然后你试图用worker[day]去取值,这就变成了用字符索引字符串,自然会抛出KeyError: '1',因为字符串只能用整数索引,根本不认字符键。
另外还有个隐藏问题:你的原始字典里worker1下有两个完全一样的datetime.date(2017,10,20)键,Python字典不允许重复键,后面的那个数组会直接覆盖前面的,这会导致你丢失数据,得先修正这个问题。
接下来是正确的解决代码,两种方式供你选:
方式一:普通循环(可读性高)
import numpy as np from datetime import date # 先修正重复键的问题,这里给worker1加了一个不同的日期 workersDays = { 'worker1': { date(2017, 10, 20): np.array(['1', '3', '64', '56', '34', '23']), date(2017, 10, 21): np.array(['12', '34', '56', '78', '98', '45']) }, 'worker2': { date(2017, 10, 21): np.array(['x', 'y', 'z']) } } # 正确遍历嵌套字典 for worker_name, day_records in workersDays.items(): # day_records是每个工人对应的日期-数组字典 for day, np_array in day_records.items(): # 把numpy数组转成list并替换回去 day_records[day] = np_array.tolist() print(workersDays)
方式二:字典推导式(更简洁)
如果喜欢简洁的写法,可以用嵌套字典推导式一步完成转换:
workersDays = { worker: {day: arr.tolist() for day, arr in day_dict.items()} for worker, day_dict in workersDays.items() }
这样处理后,所有嵌套在里面的numpy数组都会被转换成Python原生的list,同时也避免了循环对象错误的问题。
内容的提问来源于stack exchange,提问作者Gaspard Harera




