Python如何将列表/字符串拆分为成对元组并解决数值转换报错
问题修复方案
报错根因
- 类型转换错误:你的坐标序列中存在带小数点的浮点格式数值(比如
22943.23),直接调用int()转换会触发格式错误,统一转为float即可,整数数值转float不会丢失精度。 - 配对逻辑错误:原代码用
zip(data[:-1], data[1:])会将所有相邻元素两两配对,最终会生成11个冗余元组,不符合每两个数值配对的需求,需要按步长2切片分别取奇、偶位置的元素配对。
修复代码
基础版本(统一为float类型)
ip='MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1), MDSYS.SDO_ORDINATE_ARRAY(22027, 22943.23, 22026, 22939, 22025, 22936, 22025.09, 22932, 22027, 22929, 22030, 22926)' split_string_1 = "MDSYS.SDO_ORDINATE_ARRAY(" split_string_2 = ")" # 统一转换为浮点类型 data = list(map(float, ip.split(split_string_1)[1].split(split_string_2)[0].split(", "))) # 按步长2切片配对 result = list(zip(data[::2], data[1::2]))
精度匹配版本(整数保留int、小数保留float,和预期输出完全一致)
ip='MDSYS.SDO_GEOMETRY(2003, NULL, NULL, MDSYS.SDO_ELEM_INFO_ARRAY(1, 1003, 1), MDSYS.SDO_ORDINATE_ARRAY(22027, 22943.23, 22026, 22939, 22025, 22936, 22025.09, 22932, 22027, 22929, 22030, 22926)' split_string_1 = "MDSYS.SDO_ORDINATE_ARRAY(" split_string_2 = ")" def parse_num(s): try: return int(s) except ValueError: return float(s) data = list(map(parse_num, ip.split(split_string_1)[1].split(split_string_2)[0].split(", "))) result = list(zip(data[::2], data[1::2]))
输出结果
运行上述代码后得到的result和你预期的输出完全一致:
[(22027, 22943.23), (22026, 22939), (22025, 22936), (22025.09, 22932), (22027, 22929), (22030, 22926)]
内容的提问来源于stack exchange,提问作者disukumo
相关产品推荐
相关产品推荐

