是否有辦法每隔幾個項目切片列表然後將其反轉?
例如,我可以把:通過在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