2011-09-11 3 views
18

Sto cercando il modo più poderoso di implementare una versione della funzione lista extend, dove si estende a un dato indice anziché alla fine del elenco.elenco estendere() per indicizzare, inserire gli elementi dell'elenco non solo alla fine

a_list = [ "I", "rad", "list" ]              
b_list = [ "am", "a" ] 
a_list.my_extend(b_list, 1) # insert the items from b_list into a_list at index 1 

print(a_list) # would output: ['I', 'am', 'a', 'rad', 'list'] 

C'è un modo per farlo senza creare un nuovo elenco, come questo?

a_list = [ "I", "rad", "list" ] 
b_list = [ "am", "a" ] 
c_list = [] 

c_list.extend(a_list[:1]) 
c_list.extend(b_list ) 
c_list.extend(a_list[1:]) 

print(c_list) # outputs: ['I', 'am', 'a', 'rad', 'list'] 

Questo approccio non è in realtà così grave, ma ho la sensazione che potrebbe essere più facile. Può?

+2

Non c'è niente di sbagliato nella creazione di una nuova lista, ma perché lo fai a passi? È molto più semplice di questo: 'c_list = a_list [: 1] + b_list + a_list [1:]'. –

+0

Non sapevo che + era sovraccarico per le liste. – mwcz

+0

Avevo bisogno della stessa cosa, ma quasi chiedevo, invece, un modo per far "inserire" a comportarsi aggiungendo elementi di lista "scompattati" all'indice in un modo simile "estendi" ... la risposta sarebbe stata la stessa :-D – danicotra

risposta

41

Certo, è possibile utilizzare fetta di indicizzazione:

a_list[1:1] = b_list 

Proprio per dimostrare l'algoritmo generale, se si dovesse implementare la funzione my_extend in una ipotetica classe personalizzata list, sarebbe simile a questa:

def my_extend(self, other_list, index): 
    self[index:index] = other_list 

Ma in realtà non lo rendono una funzione, basta usare la notazione di sezione quando è necessario.

+0

Hah, lo sapevo! Non ho mai pensato di provarlo; Ho appena pensato che avrebbe collocato l'intero 'b_list' in' a_list' all'indice 1, piuttosto che gli elementi di 'b_list'. Ho chiaramente bisogno di rivedere le complessità dell'affettatura. Grazie mille. – mwcz

+2

Mentre mi piace questa soluzione, va leggermente contro i principi di Python, immagino perché non è immediatamente ovvio cosa succederà (non è colpa tua). Vorrei che ci fosse un argomento opzionale per estendere piuttosto ... – Stan

+2

Non so, penso che sia abbastanza ovvio una volta che ci si abitua alla notazione delle sezioni. Speriamo che 'the_list [i: j] = other_list' abbia senso per' i j" (come "the_list [5: 3] = other_list'), sarei sicuramente d'accordo sul fatto che non è intuitivamente ovvio cosa dovrebbe accadere, ma non credo che la sintassi effettivamente funziona comunque. –