2015-05-04 16 views
13

wiem, że mogę przeplatać dwie listy Pythona z:Interleave lista ze stałym elementem

[elem for pair in zip(*lists) for elem in pair] 

Teraz trzeba przeplatać listę ze stałym elementem takich jak:

list = [1, 2, 3, 4] 
# python magic 
output = [1, 0, 2, 0, 3, 0, 4] 

Odpowiedz

6

jedno rozwiązanie bardzo prosty jest:

[elem for x in list for elem in (x, 0)][:-1] 
+1

Wierzę, że to jest najprostsze i najbardziej oczywiste rozwiązanie. – recursive

+0

Jak działa ten czarodziej? – aitchnyu

+1

@aitchnyu jeśli masz strukturę zagnieżdżoną 'list = [(1,2), (3,4)]' i chcesz ją spłaszczyć, możesz użyć '[elem dla pary na liście dla elem w parze]' weź każdą "parę", a następnie weź każdy "elem" w parę. W powyższym kodzie nie masz par, ale tworzysz parę '(x, 0)' dla każdego elementu 'x' na oryginalnej liście, następnie wykorzystujesz tę samą strategię co poprzednio, aby spłaszczyć listę, uzyskanie '[x1, 0, x2, 0, x3, 0]'. Następnie usuwasz końcowe '0' używając '[: -1]'. –

6

można spróbować magii następujące itertools:

funkcja
>>> from itertools import repeat, chain, izip 
>>> l = [1, 2, 3, 4] 
>>> list(chain.from_iterable(izip(l[:-1], repeat(0)))) + l[-1:] 
[1, 0, 2, 0, 3, 0, 4] 
3

Pythona mogą być stosowane w dowolnych typów danych wspierających Ponadto, poprzez ustawienie parametru start odpowiednio. (see docs)

input = [1, 2, 3, 4] 
fixed = 0 
output = sum([[elem, fixed] for elem in input], [])[:-1] # to drop the last `fixed` 

A jeśli nie podoba mi się pomysł z wykorzystaniem operatora dodawania z list:

input = [1, 2, 3, 4] 
fixed = 0 
output = [] 
for elem in input: 
    output.extend([elem, fixed]) 
output = output[:-1] 
4
from itertools import izip, repeat 

start = [1, 2, 3, 4] 

print [i for j in izip(start, repeat(0)) for i in j][:-1] 
+0

Zauważyłem, że dołącza to dodatkowe 0 na końcu listy. – Shashank

+0

Naprawiono. Dzięki. –

1

można użyć funkcji reduce z functools.

>>> from functools import reduce 
>>> reduce(lambda x, y: x + [y, 0], [1,2,3,4], [])[:-1] 
[1, 0, 2, 0, 3, 0, 4] 
2
>>> lst = [1, 2, 3, 4] 
>>> newlst = [0]*((len(lst) * 2) - 1) 
>>> newlst[::2] = lst 
>>> newlst 
[1, 0, 2, 0, 3, 0, 4] 

To nie może być jedno-liner, ale to działa. Ponadto mój time tests wydaje się pokazywać, że jest to najszybsze rozwiązanie. W postaci funkcji, to jest:

def interzero(lst): 
    newlst = [0]*((len(lst) * 2) - 1) 
    newlst[::2] = lst 
    return newlst 
1
>>> from itertools import chain 

>>> lst = [1, 2, 3, 4] 
>>> list(chain(*zip(lst, [0]*(len(lst)-1)))) + [lst[-1]] 
[1, 0, 2, 0, 3, 0, 4] 
Powiązane problemy