2012-04-18 2 views
3

У меня есть список с N элементов, и я его фрагмент, используя определенный шаг, скажем, 3:Объединить нарезанных списки

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

После выполнения некоторой обработки separatedly, теперь мне нужно, чтобы объединить их обратно в те же позиции, что и в первоначальном списке. Есть ли аналогичный (простой) способ сделать это?

Пример:

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] 

Спасибо.

ответ

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 может быть preferrable, как и другие отметил уже.

+1

Вместо 'chain (* ...)', [chain.from_iterable] (http://docs.python.org/library/itertools.html#itertools.chain.from_iterable) может использоваться (это будет может быть полезен для Python 3.x, где 'zip' является генератором). – ovgolovin

+0

@ovgolovin: Конечно, это позволяет избежать преобразования в кортеж. –

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] 
Смежные вопросы