Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成器中的循环列表_Python_Python 3.x - Fatal编程技术网

Python 生成器中的循环列表

Python 生成器中的循环列表,python,python-3.x,Python,Python 3.x,建议s=[1,2,3,4] 如果您zip(s,s[1:])返回[(1,2)、(2,3)、(3,4)]。 是否可以重写zip(s,s[1:])以返回[(1,2)、(2,3)、(3,4)、(4,1)] 或者,为了通用性起见,是否可以将列表本身压缩为最后一个列表(列表[-1],列表[0])是的,您可以使用方便的迭代器以非常优雅的方式完成此操作: >>> from itertools import cycle, islice >>> s = [1, 2, 3, 4]

建议
s=[1,2,3,4]

如果您
zip(s,s[1:])
返回
[(1,2)、(2,3)、(3,4)]
。 是否可以重写
zip(s,s[1:])
以返回
[(1,2)、(2,3)、(3,4)、(4,1)]

或者,为了通用性起见,是否可以将列表本身压缩为最后一个列表
(列表[-1],列表[0])

是的,您可以使用方便的迭代器以非常优雅的方式完成此操作:

>>> from itertools import cycle, islice
>>> s = [1, 2, 3, 4]
>>> list(zip(s, islice(cycle(s), 1, None)))
[(1, 2), (2, 3), (3, 4), (4, 1)]
注意,
itertools.cycle
的工作原理如下:

cycle('ABCD')-->A B C D A B C D…

它是一个无限迭代器,所以要小心
zip
在最短的时间内停止,因此工作正常

另外,
itertools.islice

islice('ABCDEFG',2,无)->cdefg

它的工作原理与
slice
或序列切片类似,即
my_list[1:][==my_list[1:None][1:None]==my_list[slice(1,None)]
,但它适用于任何iterable,而不仅仅是序列

无论如何,请注意,这种方法是可推广的:

>>> list(zip(s, islice(cycle(s), 2, None)))
[(1, 3), (2, 4), (3, 1), (4, 2)]
>>> list(zip(s, islice(cycle(s), 3, None)))
[(1, 4), (2, 1), (3, 2), (4, 3)]
>>> list(zip(s, islice(cycle(s), 4, None)))
[(1, 1), (2, 2), (3, 3), (4, 4)]

一个纯python循环
zip
答案可以通过参数化切片索引生成,添加切片

s = [1, 2, 3, 4]

n = 2

list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[100]: [(3, 4), (4, 1), (1, 2), (2, 3)]

n = 0

list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[101]: [(1, 2), (2, 3), (3, 4), (4, 1)]

你的意思是
[s[0]]
@piintesky或
s[0:1]
@juanpa.arrivillaga看起来确实更一致,因此更好。
>>> s = [1, 2, 3, 4]

>>> zip(s, s[1:] + s[:1])
[(1, 2), (2, 3), (3, 4), (4, 1)]
s = [1, 2, 3, 4]

n = 2

list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[100]: [(3, 4), (4, 1), (1, 2), (2, 3)]

n = 0

list(zip(s[n::] + s[0:n], s[n+1::] + s[0:n+1]))
Out[101]: [(1, 2), (2, 3), (3, 4), (4, 1)]