Python构建字典时条件化键值赋值的正确语法
条件赋值的正确实现方案
现有代码的问题梳理
- 语法结构不完整:Python三元条件表达式的固定结构为
返回值A if 判断条件 else 返回值B,仅写if分支、省略else部分会直接触发语法解析错误 - 括号逻辑错位且未闭合:你写的
str(dataframe['home'][index] == 'home'既缺少str方法对应的闭合右括号,逻辑上也错把“home字段值和'home'的布尔比较结果”传入str转换,根本没有获取home字段本身的原始值做判断 - 字典结构不完整:拆分写的条件赋值会导致当行数据为'away'时x无对应取值、为'home'时y无对应取值,最终生成的子字典缺键,不符合存4个浮点数字段的要求
修正后的可运行代码
先把当前行的home字段值提前提取出来,避免重复写长表达式、也防止括号错位,再用完整的三元表达式给x、y赋值,匹配你原本想按主客场拆分x、y取值的逻辑,保证不管home取啥值,两个字段都有有效值:
format_redis = {} for index, team_id in dataframe.get('team_id').items(): # 提前提取当前行的home字段值 current_home = str(dataframe['home'][index]) # 补全else分支的兜底值,按实际业务替换即可 x_val = float(dataframe['x'][index]) if current_home == 'home' else 0.0 y_val = float(dataframe['y'][index]) if current_home == 'away' else 0.0 format_redis[str(team_id)] = { 'x': x_val, 'y': y_val, 'z': float(dataframe['z'][index]), 'n': float(dataframe['n'][index]) }
如果你的业务逻辑是主客场时x/y取不同列的数值,只要把else分支后的取值替换成对应列的float转换值即可,核心要保证三元表达式完整、判断的是home字段的原始值。
效率优化建议
现在逐次调用dataframe['列名'][index]取值的方式重复做列查找,效率偏低,可以直接用pandas行迭代自带的row对象简化逻辑:
format_redis = {} for _, row in dataframe.iterrows(): current_home = str(row['home']) x_val = float(row['x']) if current_home == 'home' else 0.0 y_val = float(row['y']) if current_home == 'away' else 0.0 format_redis[str(row['team_id'])] = { 'x': x_val, 'y': y_val, 'z': float(row['z']), 'n': float(row['n']) }
内容的提问来源于stack exchange,提问作者8-Bit Borges
相关产品推荐
相关产品推荐

