2014-02-10 47 views
1

我正在分割我的數據文件中的線條。下面是幾行示例:數據文件中的分割線

1:0 2:120 
1:1 2:131 
1:2 2:26 
1:3 2:568 
1:4 2:176 
1:5 2:28 3:549 
1:6 2:17 
1:7 2:6 3:217 4:401 5:636 
1:8 2:139 

我想拆就走出每個值...也許一個數組的形式:

((1, 2) , (0, 120)) 
((1, 2) , (1, 131)) 
... 
((1, 2, 3, 4, 5) , (7, 6, 217, 401, 636)) 

這意味着每行的陣列可以有不同的尺寸。 我試圖分兩步來分割它,但它不起作用。

inf = open("datafile.txt", 'r') 

for line in inf: 
line.split() 
for x in line.split(): 
    x.split(':',1) 

回答

3

您可以將使用zip功能兩個數組中的元素。

with open("Input.txt") as inf: 
    for line in inf: 
     print zip(*map(lambda x: map(int, x.split(":")), line.split())) 

輸出

[(1, 2), (0, 120)] 
[(1, 2), (1, 131)] 
[(1, 2), (2, 26)] 
[(1, 2), (3, 568)] 
[(1, 2), (4, 176)] 
[(1, 2, 3), (5, 28, 549)] 
[(1, 2), (6, 17)] 
[(1, 2, 3, 4, 5), (7, 6, 217, 401, 636)] 
[(1, 2), (8, 139)] 

建議: 這是一件好事,有with關鍵字打開文件,如我在代碼中顯示上方。因爲,它將負責關閉/釋放資源,即使程序因異常而失敗。

說明:

由於zip是一個函數調用,該參數被首先評估。讓我們稍後來到*map(lambda x: map(int, x.split(":")), line.split()),我們將lambda函數lambda x: map(int, x.split(":"))應用於由line.split()(以空格字符分割句子並返回列表)返回的字符串列表中的每個元素。

每一個分詞都將作爲參數逐個傳遞給lambda函數。如果我們採取第一種情況,首先"1:0"將發送到lambda函數爲x,其中我們根據:分割,這將列出["1", "0"],然後我們應用int函數,它將給出[1, 0]。因此,在所有行被拆分並應用lambda後,結果將如下所示

[[1, 0], [2, 120]] 
[[1, 1], [2, 131]] 
[[1, 2], [2, 26]] 
[[1, 3], [2, 568]] 
[[1, 4], [2, 176]] 
[[1, 5], [2, 28], [3, 549]] 
[[1, 6], [2, 17]] 
[[1, 7], [2, 6], [3, 217], [4, 401], [5, 636]] 
[[1, 8], [2, 139]] 

現在我們在每個列表中都有兩個元素。還記得*我們決定以後討論,這將解包列表和所有元素作爲參數傳遞給zip功能,這樣

zip([1, 0], [2, 120]) 

現在zip將選擇所有的第一要素,並把它們放在一個列表,然後它會選擇所有的第二個元素,並將它們放在一個列表中,依此類推。

這就是我們如何得到您所期望的答案。

+0

非常感謝,現在工作正常。我只是python的初學者。您能否給我一個關於zip,* map和lambda的快速評論? – user3041107

+0

@ user3041107請現在檢查已更新的答案。我已經添加了一些解釋。 – thefourtheye

+0

@ user3041107此外,請考慮[接受此答案](http://meta.stackexchange.com/a/5235/235416),如果它可以幫助您 – thefourtheye