2012-06-05 12 views
10

Hice un poco de examen, pero no tengo una respuesta definitiva para el concepto que trato de entender.Asignación de corte con una cadena en una lista

En Python, si tomo una lista, como por ejemplo:

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

Y luego intentó reemplazar el primer puntero a un objeto en la lista, es decir, 'magdalenas' utilizando el código:

L1[0:1] = 'cake' 

me gustaría obtener una lista L1:

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

Sin embargo, si tomara la misma lista y realiza la operación (Ahora con los 4 elementos de la cadena de la torta):

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

consigo la salida que inicialmente deseaba:

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

Puede alguien explicar por qué, exactamente? Supongo que cuando tomo la torta inicialmente sin que esté en una "lista", la cadena se divide en sus caracteres individuales para almacenar como referencias a esos caracteres en lugar de una sola referencia a una cadena ...

Pero no estoy del todo seguro.

+5

creo que es divertido que tomó un trozo de tarta :) – corn3lius

+0

su último ejemplo 'L1 [0: 4] = [ 'pastel']' 'rendimientos [ 'pastel']' para mí, no '['cake', 'brownies', 'cookies']' en python 2.6. - También tenga en cuenta que ya que tiene 5 votos positivos, al parecer, hizo una muy buena pregunta :) – mgilson

+0

Ah, el último ejemplo fue con respecto al código que ya se había modificado - como en, en lugar de usar: 'L1 = [ 'muffins', 'brownies', 'cookies'] ', estaba realizando el último ejemplo con' L1 = ['c', 'a', 'k', 'e', ​​'brownies', 'cookies'] ' . – Noc

Respuesta

14

dos puntos importantes:

  1. de asignación Slice toma un iterable en el lado de la derecha, y sustituyendo los elementos de la rebanada con los objetos producidos por el iterable.
  2. En Python, las cadenas son iterables: iterar sobre una cadena produce sus caracteres.

Así

L1[0:1] = 'cake' 

reemplaza el primer elemento de L1 con los caracteres individuales de 'cake'.

Para volver a colocar el primer elemento con la cadena 'cake', simplemente escriba:

L1[0] = 'cake' 

o, usando la sintaxis de asignación rebanada:

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

Muchas gracias, agradezco la respuesta; Eso despejó mucha confusión. – Noc

7

Si especifica un sector, se supone que el lado derecho es una lista/tupla (en realidad, cualquier iterable, pero tenga cuidado con los generadores que producen un número indefinido de valores).

Para volver a colocar un elemento en una lista, utilice:.

my_list[0] = "cake" 

(También puede hacer

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

si realmente desea utilizar una rebanada lista

Aquí está una pareja otras referencias relevantes: slice assignment more slice assignment

+1

+1 para la primera línea de su respuesta – Levon

+1

@Levon - ¡gracias por decir algo agradable! Realmente me gusta tu perfil. ¿Puedo copiarlo/reformularlo para el mío? Estoy harto de la actitud yah-yah que veo en las respuestas. Intento responder con información suficiente para ayudar a la persona, enfocándome en lo que percibo es su nivel (e interés). –

+1

Claro, adelante, me alegro de no ser el único que nota la actitud de algunos miembros. Y estoy totalmente de acuerdo, trato de adaptar las respuestas al nivel del OP también ... no tiene sentido mostrar la destreza de Python si la pregunta es muy básica. Es mejor ayudar con una respuesta básica sólida y guardar las cosas elegantes para las preguntas más avanzadas :) ... una vez dicho esto, esta fue una buena pregunta y obtuve un voto positivo de mí también. – Levon

3

Piense en cadenas como un contenedor de secuencias que almacena caracteres . Cuando intenta hacer asignaciones de esa manera, agrega cada elemento en la secuencia de caracteres a la lista. Al envolver "torta" en su propia lista de 1 elemento primero (llamémoslo L2), en su lugar se agrega cada elemento de L2 a L1 - no se divide recursivamente los contenedores de secuencia más allá de la secuencia más externa.

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

Esto también es válido para otros objetos de secuencia anidados. Trate de experimentar con la secuencia más anidada objetos de esta manera:

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

También vale la pena señalar que si usted no se preocupan por fin/posicionamiento en la lista, puede utilizar append() y no tener que preocuparse de su cadena de conseguir dividida arriba:

L1 = ['muffins', 'brownies','cookies'] 
L1.append('cake') 
print L1 
['muffins', 'brownies', 'cookies', 'cake'] 
Cuestiones relacionadas