Python循环内使用列表推导式访问字典数据报错如何解决?
问题解决与代码修正
错误根源
你代码里的语法错误出在j for j in len(forecast[i[0]])这部分:
len()返回的是整数,不能直接作为in后的迭代对象,必须用range(len(...))生成可遍历的索引序列- 你试图直接在
values后用列表推导式的写法不符合Python语法,values是二维numpy数组,要获取行数据要么通过索引遍历,要么直接取整组数据
正确实现方案
假设你的对象配对列表(别用list当变量名,会覆盖Python内置类型)是类似[["Name 1", "Name 2"], ...]的结构,推荐两种实现方式:
方式1:嵌套循环逐行处理(适合需要逐行自定义逻辑的场景)
# 替换成你的对象配对列表 name_pairs = [["Name 1", "Name 2"], ["Name 3", "Name 4"]] for name1, name2 in name_pairs: # 将字典转为DataFrame df_obj1 = pd.DataFrame(forecast[name1]) df_obj2 = pd.DataFrame(forecast[name2]) # 先校验两个对象的采样行数一致 if len(df_obj1) != len(df_obj2): print(f"警告:{name1}和{name2}的采样数量不匹配,跳过该组") continue # 遍历每一行采样数据(对应单个场景) for row_idx in range(len(df_obj1)): # 获取和单独执行时格式一致的行数据 data1 = df_obj1.values[row_idx] data2 = df_obj2.values[row_idx] # 这里调用你的机器学习模型做预测 # 示例:将两个数据合并为模型输入 # input_data = np.concatenate([data1, data2]).reshape(1, -1) # prediction = your_model.predict(input_data)
方式2:批量向量化处理(效率更高,适合无自定义逐行逻辑的场景)
如果你的模型支持批量输入,可以直接合并数据后一次性预测:
name_pairs = [["Name 1", "Name 2"], ["Name 3", "Name 4"]] for name1, name2 in name_pairs: df_obj1 = pd.DataFrame(forecast[name1]) df_obj2 = pd.DataFrame(forecast[name2]) if len(df_obj1) != len(df_obj2): print(f"警告:{name1}和{name2}的采样数量不匹配,跳过该组") continue # 合并两个对象的特征列,生成批量输入 batch_input = pd.concat([df_obj1, df_obj2], axis=1) # 批量预测 batch_predictions = your_model.predict(batch_input.values) # 后续处理预测结果,比如存储、分析等
额外提示
- 如果你只是需要获取所有行的数组,直接用
df.values即可,不需要额外推导式,比如pd.DataFrame(forecast['Name 1']).values会返回所有行的二维数组,和你单独取values[2]的结构一致 - 用
df.iloc[row_idx].values替代df.values[row_idx]可读性更好,也更符合pandas的常规用法
内容的提问来源于stack exchange,提问作者user178800
相关产品推荐
相关产品推荐

