2015-07-19 86 views
3

名单我有这种形状的字符串:将字符串转换为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元组列表?

回答

2

一个注释,不知道这是否意图 - 当你做d.split()[1:-2],你失去了最后一个坐标。假设不是故意的,一个一个班轮因为这将是 -

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

如果失去了最后一个坐标是故意的,在上面的代码中使用[1:-2]

2

您可以使用列表理解在一行中做到这一点。

x = [tuple(float(j) for j in i.split(",")) for i in d.split()[1:-2]] 

此经过d.split()[1:-2]],每一对应该被分组在一起,以逗号分割它们,在每个项目转换为浮点数,并且将它们在元组在一起的基团。

此外,您可能希望使用d.split()[1:-1],因为使用-2会删除最后一对坐标。

0

虽然你做的所有的权利,它是一个使用列表理解或一些功能性的东西(我的意思是“地图”),可以在某些压缩:

def coordinates(d): 
     d = d[2:-2].split() # yeah, split here into pairs 
     d = map(str.split, d, ","*len(d)) # another split, into tokens 
     # here we'd multiplied string to get right size iterable 
     return list(map(tuple, d)) # and last map with creating list 
     # from "map object" 

职高它可以用列表解析还原成一个线,但可读性也会降低(尽管现在代码很难读取)。尽管Guido不喜欢函数式编程,但我发现这更合乎逻辑......经过一些练习。祝你好运!