2015-07-19 85 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不喜歡函數式編程,但我發現這更合乎邏輯......經過一些練習。祝你好運!