不使用loop/python读取文本子字符串的更好方法

2024-10-02 00:37:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我从文件中读取行,然后遍历循环中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

Tags: 方法字符串inforgetlenlinesubstring
2条回答

通过使用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

在一个序列的固定大小片上迭代的速度不能比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))

相关问题 更多 >

    热门问题