2015-07-28 79 views
1

我有數據集線等:解析塊實體的最有效和最簡單的方法是什麼?

"1234567 12345 123456789" 
... 
... 

每列都有一個指定的塊長度,即第一個8「1234567」,第二個6和第三個9個字符等。

我可以拆分他們喜歡:

line="1234567 12345 123456789" 
datahash[0]=line[0:8] 
datahash[1]=line[9:15] 
datahash[2]=line[16:25] 

但是這是最Python的和有效的方式?

我可以通過正則表達式來實現嗎?它會更有效率嗎?

+1

如果您有具體塊長度,甚至不認爲使用正則表達式。切片是最好的解決方案。 – nhahtdh

+1

@nhahtdh:爲什麼?因爲它更乾淨或更高效? – Caniko

+3

它比正則表達式更有效率,並且你可以避免用正則表達式做出微妙的陷阱(即你確定這個假設是正確的嗎?你確定語法沒有引入一些隱藏的假設嗎?)。乾淨與否 - 我會讓別人評論。 – nhahtdh

回答

2
sample = (
"1234567 12345 123456789", 
"1234567 12345 123456789", 
"1234567 12345 123456789", 
"1234567 12345 123456789", 
) 

def slices_at(sequence,offsets=((0,7),(8,13),(14,25))): 
    for line in sequence: 
    yield tuple(line[x:y] for (x,y) in offsets) 

result = list(slices_at(sample)) 

產量:

>>> result 
[('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789'), ('1234567', '12345', '123456789')] 

重讀你的問題,我已經意識到要對前兩個字段終止空白。

這裏有一個新的函數,它接受塊長度的列表:

def slices_by_block_length(sequence,block_lengths=(8,6,9)): 
    prev = 0 
    offsets = [] 
    for length in block_lengths: 
    offsets.append((prev,prev+length)) 
    prev += length 
    for line in sequence: 
    yield tuple(line[x:y] for (x,y) in offsets) 

產量:

[('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789'), ('1234567 ', '12345 ', '123456789')] 
+0

這也是。我認爲類似的東西將是我的解決方案。 – Caniko

+0

是的。 slice_by_block_length函數是我的最愛。這是一個很好的解決方案 – Caniko

0

您也可以拆分的空間。這樣你就不會使用索引,但解決方案仍然很強大。

sample = ["1234567 12345 123456789", 
"1234567 12345 123456789", 
"1234567 12345 123456789", 
"1234567 12345 123456789"] 

def getValues(line): 
    return line.split() 

for line in sample: 
    print getValues(line) 

會產生你想要的信息。

+0

謝謝。但我也寫過,我有一個指定的塊長度 – Caniko

0

我收藏最多進一步的解決方案:

def slice_by_block_length(self,s,block_lengths): 

    arr=[] 
    for i in range(len(block_lengths)): 
     arr.append(s[sum(block_lengths[0:i]):sum(block_lengths[0:i+1])]) 
    return arr 

呼籲:

linearr=myClass.slice_by_block_length(sequence,[8,6,9]) 
相關問題