Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending a range to a list

I have some basic code that I'm not grasping the behaviour of:

L = [ 'a', 'bb', 'ccc' ]

L.append(range(2))
print len(L)

print len(L + range(1))

print len(L)

The output of which is

4
5
4

This is confusing to me, as my thought process is that the length of the initial list is 3, and appending range(2) to the end brings it to length of 5. Therefore I'd expect the output to be 5 6 5. I'm sure it's a simple quirk, but I'm a bit lost and having a hell of a time trying to find an answer online. Would anyone be able to point me in the right direction?

like image 980
Mock Avatar asked Feb 24 '17 11:02

Mock


People also ask

Can you append an array to a list?

If you are using List as an array, you can use its append(), insert(), and extend() functions. You can read more about it at Python add to List. If you are using array module, you can use the concatenation using the + operator, append(), insert(), and extend() functions to add elements to the array.

Can you append a list to a list?

append() adds a list inside of a list. Lists are objects, and when you use . append() to add another list into a list, the new items will be added as a single object (item).

Can you use += to append a list?

For a list, += is more like the extend method than like the append method. With a list to the left of the += operator, another list is needed to the right of the operator. All the items in the list to the right of the operator get added to the end of the list that is referenced to the left of the operator.


1 Answers

You appended a single list object. You did not add the elements from the list that range produces to L. A nested list object adds just one more element:

>>> L = ['a', 'bb', 'ccc']
>>> L.append(range(2))
>>> L
['a', 'bb', 'ccc', [0, 1]]

Note the [0, 1], the output of the range() function.

You are looking for list.extend() instead:

>>> L = ['a', 'bb', 'ccc']
>>> L.extend(range(2))
>>> L
['a', 'bb', 'ccc', 0, 1]
>>> len(L)
5

As an alternative to list.extend(), in most circumstances you can use += augmented assignment too (but take into account the updated L list is assigned back to L, which can lead to surprises when L was a class attribute):

>>> L = ['a', 'bb', 'ccc']
>>> L += range(2)
>>> L
['a', 'bb', 'ccc', 0, 1]
like image 131
Martijn Pieters Avatar answered Oct 20 '22 00:10

Martijn Pieters