Python如何修改字符串值并转换为int、bool等类型,实现clean_data数据清洗函数
实现代码
首先你需要提前定义好列索引常量(和业务规则保持一致):
COLUMN_RIDING = 0 COLUMN_VOTER = 1 COLUMN_RANK = 2 COLUMN_RANGE = 3 COLUMN_APPROVAL = 4
以下是仅用Python内置函数实现的clean_data函数,完全符合修改入参、无返回值的要求:
from typing import List def clean_data(data: List[List[str]]) -> None: """Modify data so that the applicable string values are converted to their appropriate type. The indexes of the string values that are converted, and their corresponding type, are: - COLUMN_RIDING is an int - COLUMN_VOTER is an int - COLUMN_RANK is a list of strings - COLUMN_RANGE is a list of integers - COLUMN_APPROVAL is a list of booleans >>> row = ['0', '1', 'NDP;Liberal;Green;CPC', '1;4;2;3', 'NO;YES;NO;NO'] >>> clean_data([row]) >>> row == SAMPLE_DATA_1[0] True >>> row = ['117', '12', 'Liberal;CPC;NDP;Green', '4;0;5;0', 'YES;NO;YES;NO'] >>> clean_data([row]) >>> row == [117, 12, ['CPC', 'GREEN', 'LIBERAL', 'NDP'], [4, 0, 5, 0], [True, False, True, False] True """ for row in data: # 选举区列:字符串转整数 row[COLUMN_RIDING] = int(row[COLUMN_RIDING]) # 选民列:字符串转整数 row[COLUMN_VOTER] = int(row[COLUMN_VOTER]) # 排名列:分号拆分、转大写、按字母升序排序 rank_items = row[COLUMN_RANK].split(';') row[COLUMN_RANK] = sorted([item.upper() for item in rank_items]) # 区间列:分号拆分、每个元素转整数 row[COLUMN_RANGE] = [int(num) for num in row[COLUMN_RANGE].split(';')] # 同意列:分号拆分、YES转True/NO转False approval_items = row[COLUMN_APPROVAL].split(';') row[COLUMN_APPROVAL] = [item == 'YES' for item in approval_items]
关键说明
- Python中列表是可变对象,直接修改遍历到的
row元素,就会同步修改原传入的data参数,符合函数无返回值的设计要求 - 排名列的处理完全匹配示例输出:拆分后转大写再按字母排序,和第二个示例的返回结果完全一致
- 所有转换逻辑仅用到
int、split、upper、sorted等Python内置函数,没有引入任何第三方依赖
原代码问题梳理
你之前的代码存在两个核心逻辑错误:
- 函数要求无返回值、直接修改入参,不需要额外生成新列表返回
COLUMN_RIDING是列的固定索引常量,不是行数据列表,不能用COLUMN_RIDING[i]判断元素类型
内容的提问来源于stack exchange,提问作者Cindy
相关产品推荐
相关产品推荐

