合并切片列表

3

我有一个包含N个元素的列表,我希望使用特定步长(比如3),对它进行切片:

slice0 = text[0::3]
slice1 = text[1::3]
slice2 = text[2::3]

在分别进行一些处理后,我现在需要将它们合并到与原始列表中相同的位置。是否有类似(简单)的方法来做到这一点?

例子:

L = [1,2,3,4,5,6] -> L0 = [1,4], L1 = [2,5], L2 = [3,6]

然后进行一些处理(比如将每个列表分别乘以1、2和3):

L0 = [1,4], L1 = [4,10], L2 = [9,18] 

合并它们回到原始位置。
L = [1,4,9,4,10,18]

谢谢您。
4个回答

5
您可以使用zip()函数将它们重新组合在一起:
>>> l0 = [1,4]; l1 = [4,10]; l2 = [9,18]
>>> zip(l0, l1, l2)
[(1, 4, 9), (4, 10, 18)]
>>> [x for t in zip(l0, l1, l2) for x in t]
[1, 4, 9, 4, 10, 18]

或者使用 itertools.chain:
>>> from itertools import chain
>>> list(chain(*zip(l0, l1, l2)))
[1, 4, 9, 4, 10, 18]

在 Python 3 中,由于 zip 是一个生成器函数,因此像其他人已经指出的那样,itertools.chain.from_iterable 可能更可取。

1
可以使用chain.from_iterable代替chain(*...)(在Python 3.x中,zip是生成器时会很有用)。 - ovgolovin
@ovgolovin:当然,这避免了转换为元组。 - Niklas B.

4
>>> L0 = [1,4]
>>> L1 = [4,10]
>>> L2 = [9,18]
>>> [x for zipped in zip(L0, L1, L2) for x in zipped]
[1, 4, 9, 4, 10, 18]

或者使用itertools.chain的替代方法:

>>> from itertools import chain
>>> list(chain.from_iterable(zip(L0, L1, L2)))
[1, 4, 9, 4, 10, 18]

2
>>> from itertools import chain
>>> l0, l1, l2, = [1,4], [4,10], [9,18]
>>> list(chain.from_iterable(zip(l0,l1,l2)))
[1, 4, 9, 4, 10, 18]

0
L0 = [1,4]
L1 = [4,10] 
L2 = [9,18]

#returns a tuple

my_data = sum(zip(L0,L1,L2),())

#or if you need a list

my_data = list(sum(zip(L0,L1,L2),()))

元组:

>>> my_data
(1, 4, 9, 4, 10, 18)

列表:

>>> my_data
[1, 4, 9, 4, 10, 18]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接