如何优雅地将字符串列表转换为浮点型嵌套坐标列表?
问题描述
现有字符串列表:
ls = ["12,45 58,96", "23,67 94,92 93,10", "45,76 33,11 46,33"]
需要将其转换为包含[x, y]浮点型坐标的嵌套列表,目标格式如下:
goal = [[[12.0,45.0], [58.0,96.0]], [[23.0,67.0], [94.0,92.0], [93.0,10.0]], [[45.0,76.0], [33.0,11.0], [46.0,33.0]]]
我已经用一段粗糙的代码实现了需求,但希望找到更优雅的写法,比如利用列表推导式或生成器简化代码。原实现代码如下:
s = [] for i in ls: i.split(' ') s.append(i) res = [i.split(' ') for i in s] # splits at the space gen = (map(lambda n: n.split(','), x) for x in res) # split list elements at comma result = (list(x) for x in gen) final = [] for i in result: # convert each string to a float sublist1 = [] for x in i: sub = [] for z in x: z = float(z) sub.append(z) sublist1.append(sub) final.append(sublist1) print(list(final))
优化实现
列表推导式版本
用三层嵌套的列表推导式可以一步完成转换,代码简洁且可读性强:
ls = ["12,45 58,96", "23,67 94,92 93,10", "45,76 33,11 46,33"] final = [[[float(coord) for coord in point.split(',')] for point in line.split(' ')] for line in ls] print(final)
生成器版本(适合大规模数据)
如果数据量较大,用生成器可以节省内存,避免一次性生成完整列表:
ls = ["12,45 58,96", "23,67 94,92 93,10", "45,76 33,11 46,33"] gen = ([[float(coord) for coord in point.split(',')] for point in line.split(' ')] for line in ls) # 按需迭代生成器 for item in gen: print(item)
代码逻辑说明
- 最外层:遍历
ls中的每一行字符串line - 中间层:将每一行按空格
' '分割成单个坐标字符串point(比如"12,45") - 最内层:将每个坐标字符串按逗号
','分割成两个数字字符串,再分别转为float类型,组成[x, y]的坐标列表
原代码冗余点说明
- 第一步的
for i in ls循环完全多余:i.split(' ')没有赋值给任何变量,直接append(i)相当于把原字符串加入s,后续res = [i.split(' ') for i in s]其实和[i.split(' ') for i in ls]效果一致 - 用
map和生成器的拆分步骤可以直接合并到列表推导中,无需单独拆分多个环节
内容的提问来源于stack exchange,提问作者eNath
相关产品推荐
相关产品推荐

