是否有办法每隔几个项目切片列表然后将其反转?
例如,我可以把:通过在Python3.x中切片来操作列表
1 2 3 4 5 6 7 8 9
到:
7 8 9 4 5 6 1 2 3
有一个简单的切片表示法,可以实现类似的这一目标列出[:: - 1]用于逆转列表?
是否有办法每隔几个项目切片列表然后将其反转?
例如,我可以把:通过在Python3.x中切片来操作列表
1 2 3 4 5 6 7 8 9
到:
7 8 9 4 5 6 1 2 3
有一个简单的切片表示法,可以实现类似的这一目标列出[:: - 1]用于逆转列表?
没有此片的符号,这里是如何(,Python的3.x的代码包含在这到底是与Python 2.x的),我可能会做:
>>> lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> [x for s in reversed(zip(*[iter(lst)]*3)) for x in s]
[7, 8, 9, 4, 5, 6, 1, 2, 3]
这种方法用于集群元素融入n
长组直接来自zip
文档,所以这里的做法是创建组3,反向结果列表中,然后用一个列表理解压扁。
或者利用迭代模块,采用grouper
recipe和chain.from_iterable
:
from itertools import izip_longest, chain
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
result = list(chain.from_iterable(reversed(list(grouper(lst, 3)))))
的Python 3版本:
对于第一种方法,你将需要由zip
返回发电机转换到一个列表,否则reversed
将失败:
>>> [x for s in reversed(list(zip(*[iter(lst)]*3))) for x in s]
[7, 8, 9, 4, 5, 6, 1, 2, 3]
而在itertools方法中,您只需在导入语句和grouper
函数内部将izip_longest
替换为zip_longest
即可。
这是正确的python3.3? – somebody
刚刚编辑了Python 3所需的更改。 –
QTYPERGROUP = 3
lst = [1,2,3,4,5,6,7,8,9]
reversed_by_group = [el for sublist in list(reversed(list(zip(*[iter(lst)]*QTYPERGROUP)))) for el in sublist]
# [7, 8, 9, 4, 5, 6, 1, 2, 3]
这是漫长而丑陋的,但它的确是工作。请注意,这只适用于len(lst) % QTYPERGROUP == 0
,否则将忽略其余部分。例如
QTYPERGROUP = 4
reversed_by_group = [el for sublist in list(reversed(list(zip(*[iter(lst)]*QTYPERGROUP)))) for el in sublist]
# [5, 6, 7, 8, 1, 2, 3, 4] there's no "9"
numpy
可以让这样的事情您轻松:
>>> import numpy as np
>>> a = np.arange(1, 10)
>>> result = a.reshape((3, -1))[::-1].ravel() #if you OK with getting np.array
>>> result
array([7, 8, 9, 4, 5, 6, 1, 2, 3])
如果你想有一个列表
>>> result = a.reshape((3, -1))[::-1].ravel().tolist() #if you want to get back a list
>>> result
[7, 8, 9, 4, 5, 6, 1, 2, 3]
此解决方案仅适用如果列表可以分为n个等份。
“有没有......切片符号可以实现这个目标”是的。 “是否有一个***简单的***切片符号可以实现这个目标”No.挂上让我写点东西了.... –
我想切片它的每个项目,然后扭转它们,如果这有助于。 –
somebody