我有一个名为dirs
的目录列表。
我还有一个名为snake
的自定义计数器函数,它使用以下语法。
snake(low, high, x)
其用法的一个例子是
[snake(1,3,x) for x in range(8)]
[1, 2, 3, 3, 2, 1, 1, 2]
dirs
包含多个相同的目录。例如
[/my/path/one/, /my/path/one/, /my/path/one/, /my/path/one/,
/my/path/two/, /my/path/two/, /my/path/two/]
我想使用snake创建一个变量,该变量具有一组与dirs
关联的索引,当列表中遇到新的目录名称时,snake模式将重置。像这样:
ind = [1, 2, 3, 3, 1, 2, 3]
这怎么实现?
答案 0 :(得分:1)
在纯python中:
def snake(low, high):
return itertools.cycle(itertools.chain(
range(low, high + 1),
range(high, low - 1, -1)))
用法:
>>> list(itertools.islice(snake(1, 3), 8))
[1, 2, 3, 3, 2, 1, 1, 2]
现在让我们写一条害羞的蛇,当遇到新的项目时,它会惊慌并重置生成器:
def shy_snake(low, high, iterable):
"""d-d-doesss s-s-sssenpai noticesss me?"""
prev = None
for x in iterable:
if x != prev:
prev = x
snake_it = snake(low, high)
yield next(snake_it)
实际上,我们可以更通用地编写此代码,以与任何序列生成器一起使用:
def shy(seq_func, iterable):
prev = None
for x in iterable:
if x != prev:
prev = x
it = seq_func()
yield next(it)
def shy_snake(low, high, iterable):
"""d-d-doesss s-s-sssenpai noticesss me?"""
return shy(lambda: snake(low, high), iterable)
测试:
>>> dirs = [1, 1, 1, 1, 2, 2, 2]
>>> list(shy_snake(1, 3, dirs))
[1, 2, 3, 3, 1, 2, 3]