什么是一个好的,python风格的方法来一次产生一个字符串/字节/列表的范围子集?

wi3ka0sx  于 2022-12-15  发布在  Python
关注(0)|答案(1)|浏览(72)

我想循环bytes数据,我希望同样的原则也能应用到字符串和列表中,我不是一个一个的去,而是一次去几个,我知道我可以用mystr[0:5]来得到前五个字符,我想在循环中做。
我可以用C风格的方法来做,在范围内循环,然后返回剩余的元素(如果有的话):

import math
def chunkify(listorstr, chunksize:int):
    # Loop until the last chunk that is still chunksize long
    end_index = int(math.floor(len(listorstr)/chunksize))
    for i in range(0, end_index):
        print(f"yield ")
        yield listorstr[i*chunksize:(i+1)*chunksize]
    # If anything remains at the end, yield the rest
    remainder = len(listorstr)%chunksize
    if remainder != 0:
        yield listorstr[end_index*chunksize:len(listorstr)]
        
[i for i in chunkify("123456789", 2)]

这工作得很好,但我强烈怀疑python语言的特性可以使它更紧凑。

93ze6v8z

93ze6v8z1#

可以使用rangestep参数压缩代码。

listorstr[i:i+chunksize] for i in range(0,len(listorstr), chunksize)

您的函数可以从此生成器中生成,以使调用更整洁。

def chunkify(listorstr, chunksize:int):
    yield from (listorstr[i:i+chunksize] 
        for i in range(0,len(listorstr), chunksize))

相关问题