2012-03-07 16 views
5

Załóżmy, że mam prostą listę Pythona takiego:Walcząc ze składnią slice dołączyć do listy element części listy

>>> l=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] 

Załóżmy teraz chcę połączyć l[2:6] do jednego elementu tak:

>>> l 
['0', '1', '2345', '6', '7', '8', '9'] 

jestem w stanie to zrobić w krokach do nowej listy, jak to:

>>> l2=l[0:2] 
>>> l2.append(''.join(l[2:6])) 
>>> l2.extend(l[6:]) 
>>> l2 
['0', '1', '2345', '6', '7', '8', '9'] 

T tutaj sposób (którego mi brakuje), aby zrobić to prostiej i na miejscu na oryginalnej liście l?

Edit

Jak zwykle Sven Marnach miał doskonałą odpowiedź natychmiastowy:

l[2:6] = ["".join(l[2:6])] 

próbowałem:

l[2:6] = "".join(l[2:6]) 

ale bez szelek, ciąg wytwarzany przez sprzężenie zostało następnie potraktowane jako iterowalne umieszczenie każdej postaci z powrotem na liście i cofnięcie łączenia!

Rozważmy:

>>> l=['abc','def','ghk','lmn','opq'] 
>>> l[1:3]=[''.join(l[1:3])] 
>>> l 
['abc', 'defghk', 'lmn', 'opq'] #correct 

>>> l=['abc','def','ghk','lmn','opq'] 
>>> l[1:3]=''.join(l[1:3]) 
>>> l 
['abc', 'd', 'e', 'f', 'g', 'h', 'k', 'lmn', 'opq'] #not correct 

Odpowiedz

11

użyć przypisania plaster:

l[2:6] = ["".join(l[2:6])] 
+0

To szelki wokół złącza, którego mi brakowało !!! Dzięki! – dawg

1

Tak, dość prosty:

l[2:6] = [''.join(l[2:6])] 
1

Należy zwrócić uwagę na różnicę pomiędzy cesją slice:

>>> a = range(3) 
>>> a 
[0, 1, 2] 
>>> a[1:3] = [4, 5, 6] 
>>> a 
[0, 4, 5, 6] 

i przypisanie EXTENDED plaster:

>>> a=range(6) 
>>> a 
[0, 1, 2, 3, 4, 5] 
>>> a[::2] 
[0, 2, 4] 
>>> a[::2]=[-1,-2,-3] 
>>> a 
[-1, 1, -2, 3, -3, 5] 
>>> a[::2]=[-1,-2] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: attempt to assign sequence of size 2 to extended slice of size 3 

Jeżeli LH rozszerzony plaster RH musi być sekwencją o tej samej długości. Regularne przypisanie przekroju może zmienić długość listy na LH.

Powiązane problemy