使用自定义计数器循环浏览列表

时间:2018-07-03 01:19:30

标签: python

我有一个名为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] 

这怎么实现?

1 个答案:

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