You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优雅地将字符串列表转换为浮点型嵌套坐标列表?

问题描述

现有字符串列表:

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)
代码逻辑说明
  1. 最外层:遍历ls中的每一行字符串line
  2. 中间层:将每一行按空格' '分割成单个坐标字符串point(比如"12,45")
  3. 最内层:将每个坐标字符串按逗号','分割成两个数字字符串,再分别转为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 14:00:47