我正在读取文件中的行,然后在循环中遍历每个重叠的k大小的子串,然后处理这些字符串。什么是更好(更有效和优雅)的方式来阅读子串?如何在没有循环的情况下创建列表?
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 :(得分: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 :(得分: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))