Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Slice Assignment with a String in a List

I did quite a bit of perusing, but I don't have a definite answer for the concept that I'm trying to understand.

In Python, if I take a list, such as:

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

And then attempted to replace the first pointer to an object in the list, namely 'muffins' by using the code:

L1[0:1] = 'cake'

I would get a list L1:

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

Yet if I took the same list and performed the operation (now with the 4 elements from the string cake):

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

I get the output I initially desired:

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

Can anyone explain why that is, exactly? I'm assuming that when I take cake initially without it being in a "list", it breaks the string into its individual characters to be stored as references to those characters as opposed to a single reference to a string...

But I'm not entirely sure.

like image 346
Noc Avatar asked Jun 05 '12 18:06

Noc


People also ask

Can a string slice expression be used on a list?

So far, we have shown examples of lists ( list type), but slices can be used with other sequence objects such as strings str and tuples tuple as well. However, str and tuple are immutable, so new values cannot be assigned.

Can we do slicing in list?

As well as using slicing to extract part of a list (i.e. a slice on the right hand sign of an equal sign), you can set the value of elements in a list by using a slice on the left hand side of an equal sign. In python terminology, this is because lists are mutable objects, while strings are immutable.

Does slicing work on strings?

slice() The slice() method extracts a section of a string and returns it as a new string, without modifying the original string.

How do I slice a data list in Python?

The format for list slicing is [start:stop:step]. start is the index of the list where slicing starts. stop is the index of the list where slicing ends. step allows you to select nth item within the range start to stop.


3 Answers

Two important points:

  1. Slice assignment takes an iterable on the right-hand side, and replaces the elements of the slice with the objects produced by the iterable.
  2. In Python, strings are iterable: iterating over a string yields its characters.

Thus

L1[0:1] = 'cake'

replaces the first element of L1 with the individual characters of 'cake'.

To replace the first element with the string 'cake', simply write:

L1[0] = 'cake'

or, using the slice assignment syntax:

L1[0:1] = ['cake']
like image 121
NPE Avatar answered Oct 03 '22 17:10

NPE


If you specify a slice, the righthand side is presumed to be a list/tuple (actually, any iterable - but watch out for generators that produce an indefinite number of values).

To replace an item in a list, use:

my_list[0] = "cake"

(You could also do

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

if you really want to use a list slice.

Here are a couple other relevant refs: slice assignment more slice assignment

like image 20
Art Swri Avatar answered Oct 03 '22 18:10

Art Swri


Think of strings as being a sequence container that stores characters. When you try to do assignments that way, it adds each item in the character sequence to the list. By wrapping "cake" in its own 1-element list first (let's call it L2), you're instead adding each element of L2 to L1 -- it does not recursively split up sequence containers beyond the outermost sequence.

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

This is also true for other nested sequence objects. Try experimenting with more nested sequence objects like this:

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

It's also worth noting that if you don't care about order/positioning in the list, you can use append() and not have to worry about your string getting split up:

L1 = ['muffins', 'brownies','cookies']
L1.append('cake')
print L1
['muffins', 'brownies', 'cookies', 'cake']
like image 37
Joe Baker Avatar answered Oct 03 '22 18:10

Joe Baker