Python 使用自定义计数器在列表中循环
我有一个名为Python 使用自定义计数器在列表中循环,python,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/, /m
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]
如何实现这一点?在纯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]
非常有趣。。。如何将
dirs
中的字符串列表
转换为shy\u snake
所需的iterable
?这是的优点=
运算符是指它同时适用于整数和字符串。:)您可以直接将dirs
插入其中。酷。。我需要玩这个,让我的思想围绕它。这比我以前使用的更数学的snake
函数要简单得多。。。我刚刚意识到我的应用程序仅限于python2.7,因为我需要使用Jython.Itertools和snake中的星形表达式