带切片字符串的Python迭代器

2024-09-29 22:37:04 发布

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

我想要无限迭代器/生成器,每转返回一个恒定宽度的字符串。死简单的代码

s = '123456789 '
it = my_iter(s, 9)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
print(next(it))

将返回:

123456789
23456789 
3456789 1
456789 12

我相信cycle表单intercools会有帮助,但我可以将cycle的环绕和切片结合起来。以下不是包装版本:

def my_iter(s, d):
    i = 0
    while True:
        yield s[i:d+i]
        i = i + 1

Tags: 字符串代码版本表单宽度mydef切片
2条回答

最自然的旋转习惯用法使用deque.rotate

from collections import deque

def my_iter(s, d):
    q = deque(s)
    while True:
        yield "".join(q)[:d]
        q.rotate(-1)

i = my_iter("123456789 ", 9)
for _ in range(15):
    print(next(i))

123456789
23456789 
3456789 1
456789 12
56789 123
6789 1234
789 12345
89 123456
9 1234567
 12345678
123456789
23456789 
3456789 1
456789 12
56789 123

如果要在一个周期结束后重新启动迭代,请尝试:

def my_iter(s, d):
    i = 0
    while True:
        if i > d:
            i = 0
        yield s[i:] + s[:max(0, i - 1)]
        i += 1
        
s = '123456789 '
it = my_iter(s, 9)
for _ in range(20):
    print(next(it))

输出:

123456789 
23456789 
3456789 1
456789 12
56789 123
6789 1234
789 12345
89 123456
9 1234567
 12345678
123456789 
23456789 
3456789 1
456789 12
56789 123
6789 1234
789 12345
89 123456
9 1234567
 12345678

或者,如果要提供与先前运行相同的输出,请尝试:

def my_iter(s, d):
    i = 0
    while True:
        yield s[i:] + s[:max(0, i - 1)]
        i += 1

s = '123456789 '
it = my_iter(s, 9)
for _ in range(12):
    print(next(it))

输出:

123456789 
23456789 
3456789 1
456789 12
56789 123
6789 1234
789 12345
89 123456
9 1234567
 12345678
123456789
123456789

相关问题 更多 >

    热门问题