2012-06-05 11 views
10

Ho fatto un po 'di attenzione, ma non ho una risposta definitiva per il concetto che sto cercando di capire.Slice assegnazione con una stringa in un elenco

In Python, se prendo un elenco, come ad esempio:

L1=['muffins', 'brownies','cookies'] 

E poi tentato di sostituire il primo puntatore ad un oggetto nella lista, vale a dire 'muffin' utilizzando il codice:

L1[0:1] = 'cake' 

vorrei avere una lista L1:

['c', 'a', 'k', 'e', 'brownies', 'cookies'] 

Eppure, se ho preso la stessa lista ed eseguita l'operazione (Ora con i 4 elementi della torta String):

L1[0:4] = ['cake'] # presumably, it's now passing the string cake within a list? (it passed into the modified list shown above) 

ho l'uscita inizialmente ho desiderato:

['cake', 'brownies', 'cookies'] 

qualcuno può spiegare perché questo è, esattamente? Suppongo che quando prendo la torta inizialmente senza che sia in una "lista", essa spezza la stringa nei suoi singoli caratteri da memorizzare come riferimenti a quei caratteri rispetto a un singolo riferimento a una stringa ...

Ma non ne sono del tutto sicuro.

+5

penso che la sua divertente che hai preso una fetta di torta :) – corn3lius

+0

tuo ultimo esempio 'L1 [0: 4] = [ 'torta']' 'rendimenti [ 'torta']' per me, non '['cake', 'brownies', 'cookies']' su python 2.6. - Notate anche che poiché avete già 5 upvotes, apparentemente avete fatto una bella domanda :) – mgilson

+0

Ah, l'ultimo esempio era rispetto al codice che era già stato modificato - come in, invece di usare: 'L1 = [ 'muffin', 'brownies', 'cookies'] ', stavo eseguendo l'ultimo esempio con' L1 = ['c', 'a', 'k', 'e', ​​'brownies', 'cookies'] ' . – Noc

risposta

14

Due punti importanti:

  1. assegnazione Fetta prende un iterabile sul lato destro, e sostituisce gli elementi della fetta con gli oggetti prodotti da iterable.
  2. In Python, le stringhe sono iterabili: l'iterazione su una stringa produce i suoi caratteri.

Così

L1[0:1] = 'cake' 

sostituisce il primo elemento di L1 con i singoli caratteri di 'cake'.

Per sostituire il primo elemento con la stringa 'cake', è sufficiente scrivere:

L1[0] = 'cake' 

o, utilizzando la sintassi assegnamento di una fetta:

L1[0:1] = ['cake'] 
+0

Grazie mille, apprezzo la risposta; questo ha chiarito un sacco di confusione. – Noc

7

Se si specifica una sezione, si presume che il lato destro sia una lista/tupla (in realtà, qualsiasi iterabile, ma attenzione ai generatori che producono un numero indefinito di valori).

Per sostituire un elemento in un elenco, utilizzare:.

my_list[0] = "cake" 

(Si potrebbe anche fare

my_list[0:1] = ["cake"] 

se davvero si vuole utilizzare una fetta lista

Qui ci sono coppia altri riferimenti pertinenti: slice assignment more slice assignment

+1

+1 per la prima riga della risposta – Levon

+1

@Levon - grazie per aver detto qualcosa di carino! Mi piace molto il tuo profilo BTW - posso copiarlo/ridurlo per il mio? Sono piuttosto stufo dell'atteggiamento yah-yah che vedo nelle risposte. Provo a rispondere con informazioni sufficienti per aiutare la persona, mirato a ciò che percepisco sia il loro livello (e interesse). –

+1

Certo, vai avanti, contento di non essere l'unico a notare l'atteggiamento di alcuni membri. E sono assolutamente d'accordo, cerco anche di adeguare le risposte al livello dell'OP. Non è un caso mostrare le abilità di Python se la domanda è molto semplice. Meglio aiutare con una solida risposta di base e salvare le cose fantasiose per le domande più avanzate :) .. detto questo, questa è stata una buona domanda e ho ottenuto un upvote da me. – Levon

3

Pensate stringhe come un contenitore di sequenza che memorizza caratteri . Quando provi a fare assegnazioni in questo modo, aggiunge ogni elemento nella sequenza di caratteri all'elenco. Inserendo per prima cosa "cake" nella propria lista di 1 elementi (chiamiamola L2), si aggiunge invece ciascun elemento di L2 a L1 - non divide in modo ricorsivo i contenitori di sequenza oltre la sequenza più esterna.

L1 = ['muffins', 'brownies','cookies'] 
L2 = ['cake'] 
L1[0:1] = L2 
print L1 
['cake', 'brownies', 'cookies'] 

Questo vale anche per altri oggetti di sequenza nidificati. Provare a sperimentare con più sequenza nidificata oggetti come questo:

L3 = [['pie', 'eclairs'], ['bacon', 'chocolate']] 
L1[0:1] = L3 
print L1 
[['pie', 'eclairs'], ['bacon', 'chocolate'], 'brownies', 'cookies'] 

E 'anche interessante notare che se non si cura di ordine/posizionamento nella lista, è possibile utilizzare append() e non devono preoccuparsi di stringa di ottenere spaccatura up:

L1 = ['muffins', 'brownies','cookies'] 
L1.append('cake') 
print L1 
['muffins', 'brownies', 'cookies', 'cake'] 
Problemi correlati