没有循环/ python的更好的方法来读取文本的子串

时间:2017-07-27 14:04:55

标签: python string list loops

我正在读取文件中的行,然后在循环中遍历每个重叠的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

2 个答案:

答案 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))