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)]