将字符串转换为2元组的列表

我有这样形状的琴弦:

d="M 997.14282,452.3622 877.54125,539.83678 757.38907,453.12006 802.7325,312.0516 950.90847,311.58322 Z"

它们是五边形的(x,y)坐标(首字母和尾字母是元数据,将被忽略).我想要的是一个由2个元组组成的列表,这些列表可以表示浮点中的坐标,而无需花很多功夫:

d = [(997.14282, 452.3622), (877.54125, 539.83678), (757.38907, 453.12006), (802.7325,312.0516), (950.90847, 311.58322)]

修剪字符串很容易:

>>> d.split()[1:-2]
['997.14282,452.3622', '877.54125,539.83678', '757.38907,453.12006', '802.7325,312.0516']

但是现在我想以简洁的方式创建元组.这显然行不通:

>>> tuple('997.14282,452.3622')
('9', '9', '7', '.', '1', '4', '2', '8', '2', ',', '4', '5', '2', '.', '3', '6', '2', '2')

以原始字符串,我可以这样写:

def coordinates(d):
    list_of_coordinates = []
    d = d.split()[1:-2]
    for elem in d:
        l = elem.split(',')
        list_of_coordinates.append((float(l[0]), float(l[1])))
    return list_of_coordinates

正常工作:

>>> coordinates("M 997.14282,452.3622 877.54125,539.83678 757.38907,453.12006 802.7325,312.0516 950.90847,311.58322 Z")
[(997.14282, 452.3622), (877.54125, 539.83678), (757.38907, 453.12006), (802.7325, 312.0516)]

但是,此处理只是较大程序中的一小部分,而且微不足道,我宁愿使它尽可能简短.谁能告诉我一种不太冗长的方式将字符串转换为2元组列表吗?

解决方法:

注意,不确定是否要这样做-执行d.split()[1:-2]时,您将丢失最后一个坐标.假设这不是故意的,为此的一个班轮是-

def coordinates1(d):
    return [tuple(map(float,coords.split(','))) for coords in d.split()[1:-1]]

如果有意丢失最后一个坐标,请在上面的代码中使用[1:-2].

上一篇:如何将2个简短列表中的元素追加到另一个大元组列表中?


下一篇:一组类属性的元组的Python速记