2017-07-27 45 views
0

我正在讀取文件中的行,然後遍歷循環中的每個重疊的k大小的子字符串,然後處理這些字符串。什麼會更好(更高效和優雅)的方式來讀取子字符串?如何在沒有循環的情況下創建列表?更好的方式來讀取文本的子字符串沒有循環/ python

for line in lines[1::4]: 
    startIdx = 0 
    while startIdx + k <= len(line): 
     substring = line[startIdx:(startIdx+k)] 
     countFromSb[substring] = countFromSb.get(substring, 0) + 1 
     startIdx += 1 
    linesProcessed += 1 
+0

你想做什麼?如何正則表達式? –

+0

您的解決方案是否正常工作?如果是的話爲什麼你想要不同的東西? – wwii

+0

@wwii只是想讓它更有效率。我需要對同一個文本進行更多的掃描來遍歷子字符串。高效的意思是更快/不需要相同的計算一遍又一遍/不保持內存中的大數據結構 – dusa

回答

1

它可以通過使用collections.Counter實例

countFromSb = Counter() 
# ... 
n = -1 
for n, line in enumerate(lines[1::4]): 
    countFromSb.update(line[i:i+k] for i in range(1+len(line)-k)) 
lines_processed = n + 1 
1

你不能對一個序列比任何O(N)更快的固定大小的切片重複進行更優雅,所以你當前的方法已經儘可能高效了。

在優雅的方面,你可以抽象迭代到它自己的功能,這將保持當前的範圍有一個字母的變量名更簡潔:

def iter_slices(s, size): 
    for i in range(len(s)-size+1): 
     yield s[i:i+size] 

for line in lines[1::4]: 
    for substring in iter_slices(line, k): 
     countFromSb[substring] = countFromSb.get(substring, 0) + 1 
    linesProcessed += 1 

這也與Gribouillis的建議,要結合使用計數器,完全消除for塊:

countFromSb = Counter(substring for line in lines[1::4] for substring in iter_slices(line, k)) 
相關問題