如何简化Battle类中重复的Pandas循环代码?
简化Battle类重复循环代码方案
先看你可能存在的重复代码示例
假设你的__init__方法原本是这样的重复逻辑:
class Battle: def __init__(self, data): # 处理player_stats self.player_stats = [] for col in data.player_stats.columns: self.player_stats.append(data.player_stats.iloc[0][col]) # 处理enemy_stats self.enemy_stats = [] for col in data.enemy_stats.columns: self.enemy_stats.append(data.enemy_stats.iloc[0][col]) # 处理更多类似属性...
优化后的代码(利用目标属性名列表)
假设你已经拿到了目标属性名列表(比如target_attrs = ['player_stats', 'enemy_stats', ...]),可以用以下方式简化:
class Battle: def __init__(self, data): # 你已获取到的目标属性名列表 target_attrs = ['player_stats', 'enemy_stats', 'battle_env'] for attr_name in target_attrs: # 动态获取data对应的DataFrame属性 df = getattr(data, attr_name) # 直接提取第0行转为列表(替代手动循环列) attr_values = df.iloc[0].tolist() # 动态设置为实例属性 setattr(self, attr_name, attr_values)
关键说明
getattr(data, attr_name):动态获取data的对应属性,避免硬编码每个属性名df.iloc[0].tolist():Pandas内置方法直接将第0行数据转为列表,省去手动遍历列的重复循环setattr(self, attr_name, attr_values):动态给实例设置属性,对应原来的self.xxx = ...写法
如果需要额外逻辑(比如过滤列)
要是循环里需要对列做筛选,只需要在循环内添加处理逻辑即可,比如只保留数值型列:
for attr_name in target_attrs: df = getattr(data, attr_name) # 筛选数值型列 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns attr_values = df.loc[0, numeric_cols].tolist() setattr(self, attr_name, attr_values)
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

