反转列表的相同大小的块

时间:2017-07-22 16:02:50

标签: python

如果我有一个清单:

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3] 

我的目标是将其拆分为相等大小的n块,反转每个块,然后按顺序放回块。因此,对于上面的示例,对于块大小4,我得到:

[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3] 
[_________]  [_________] [________]  [______]
     |            |           |          | 
     1            2           3          4 (this is smaller than 4 but receives the same treatment)

                     ||

[4, 3, 2, 1,    4, 3, 2, 1,      4, 3, 2, 1,     3, 2, 1]

这就是我所拥有的:

n = 4
l = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3] 
chunks = [l[i : i + n] for i in range(0, len(l), n)]
print(chunks)
# [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3]]

for i in range(len(chunks)):
    chunks[i] = list(reversed(chunks[i])) # or chunks[i] = chunks[i][::-1]

from functools import reduce
out = list(reduce(lambda x, y: x + y, chunks))

print(out)
# [4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 3, 2, 1]

我认为这不是很好。还有另一种方法可以更好地利用python的库吗?

2 个答案:

答案 0 :(得分:5)

使用以下列表理解怎么样:

[x for i in range(0,len(l),4) for x in reversed(l[i:i+4])]

或参数化块大小:

chunk = 4
[x for i in range(0,len(l),chunk) for x in reversed(l[i:i+chunk])]

这会产生:

>>> [x for i in range(0,len(l),4) for x in reversed(l[i:i+4])]
[4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 3, 2, 1]

您的给定列表。此外,我想这是非常具有说服力的(reversed(..)表示你反向等)。

答案 1 :(得分:1)

列表理解肯定看起来不错,但也许只是做一个for循环并自行更新每个块更具可读性:

lst = [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3]
chunk = 4

for i in range(0, len(lst), chunk):
    lst[i:i+chunk] = reversed(lst[i:i+chunk])

print(lst)
# [4, 3, 2, 1, 4, 3, 2, 1, 4, 3, 2, 1, 3, 2, 1]

如果您不希望更新到位,则可以在开始时执行out = lst[:]