# List with lists in Python

I have a list containing several lists with two elements each. I want to multiply the last element in the inner lists with a number x, and then print the new list. How do I do this?

Last edited:

Related Programming and Computer Science News on Phys.org
jedishrfu
Mentor
Is this a homework assignment? If so what is the actual problem you're trying to solve.

Start by making a for loop to iterate through the list and within the for loop work with the inner list.

Is this a homework assignment? If so what is the actual problem you're trying to solve.

Start by making a for loop to iterate through the list and within the for loop work with the inner list.
This is not an assignment, I'm just practicing for a test. I tried this, but I did'nt work properly, so I must be doing something wrong. My x is 5 by the way

FactChecker
Gold Member
I don't see the index, j, actually used in the inner loop. That seems wrong. I think mylist should have 3 indices in the inner loop.

CORRECTION: Looking at the definition of mylist, the inner loop is not needed and there are only two indices.

Last edited:
Kolika28
jedishrfu
Mentor
Because your inner list has only two elements and you know you want the change a specific one then theres no need for the inner for loop.

The trailing print statement should be outdented to run once outside the for loop or you should print only mylist[ i ].

The inner list looks to be an ordered set of related data and could be better represented by a tuple rather than a list. Of course this would mean unpacking, processing and making a new tuple.

Lastly try not to use common words like sum for variable names especially here when you’re not even summing. Sum may be a python keyword or function too which could cause issues at some point.

Kolika28 and FactChecker
wle
Python:
for pair in mylist:
pair[1] *= 5

Kolika28, FactChecker and jedishrfu
General code:
Code:
mylist=[[2000, 28],
[2001, 32],
[2002, 36],
[2003, 39]]

newlist=list(mylist)
number=len(newlist)
for i in range(number):
newlist[i][-1]=round(newlist[i][-1]*5)
print(newlist)
print(mylist)
So I have almost figured it out now. I only have one problem left: when I'm working with newlist, the orginal also gets modified. My textbook tells me that I have to use the function list() to make a copy of the orginal, but it doesn't work.

Ibix
Python:
mylist=[m[:-1]+[5*m[-1]] for m in mylist]
m becomes each element (i.e., each sub-list) in mylist in turn. m[:-1] is every element in m except the last, and m[-1] is the last element. Technically this structure is called a generator, because it's a process for generating modified elements from mylist. Wrapping the whole thing in square brackets gets python to execute the generator and return the result as a list.

Ibix
General code:
Code:
mylist=[[2000, 28],
[2001, 32],
[2002, 36],
[2003, 39]]

newlist=list(mylist)
number=len(newlist)
for i in range(number):
newlist[i][-1]=round(newlist[i][-1]*5)
print(newlist)
print(mylist)
So I have almost figured it out now. I only have one problem left: when I'm working with newlist, the orginal also gets modified. My textbook tells me that I have to use the function list() to make a copy of the orginal, but it doesn't work.
I think the problem is that list(mylist) makes a copy of your list, but it still contains the same sublists - you didn't copy those. So you need to copy newlist[i] before modifying it.

Kolika28
I think the problem is that list(mylist) makes a copy of your list, but it still contains the same sublists - you didn't copy those. So you need to copy newlist[i] before modifying it.
Hmm, I'm not quite sure if I understand what you mean...

FactChecker
Gold Member
mylist consists of pointers to the sublists. Copying mylist to newlist just copies the pointers, but those pointers still point to the original sublists. So changing the sublist entries through the newlist copy actually changes the original sublists.

Ibix
Ibix
Hmm, I'm not quite sure if I understand what you mean...
What @FactChecker says.

Lists in python don't, strictly speaking, contain their elements. Instead, they contain the memory addresses where their elements can be found. So copying the list doesn't copy the sub-lists, just the addresses, and modifying the sub-list "in" the copy modifies the sub-list "in" the original.

So you need to make your newlist from copies of each of the sublists in the original.

Edit: think of a list of the things in a drawer. Copying the list doesn't copy the contents of the drawer.

Kolika28 and FactChecker
wle
You can use a list comprehension if you want to create a new list without modifying the original one.
Python:
newlist = [[x, 5*y] for [x, y] in mylist]

What @FactChecker says.

Lists in python don't, strictly speaking, contain their elements. Instead, they contain the memory addresses where their elements can be found. So copying the list doesn't copy the sub-lists, just the addresses, and modifying the sub-list "in" the copy modifies the sub-list "in" the original.

So you need to make your newlist from copies of each of the sublists in the original.

Edit: think of a list of the things in a drawer. Copying the list doesn't copy the contents of the drawer.
Ohh, I see. Thank you for a good explanation!
You can use a list comprehension if you want to create a new list without modifying the original one.
Python:
newlist = [[x, 5*y] for [x, y] in mylist]
Thank you, I will try this!

wle
What @FactChecker says.

Lists in python don't, strictly speaking, contain their elements. Instead, they contain the memory addresses where their elements can be found. So copying the list doesn't copy the sub-lists, just the addresses, and modifying the sub-list "in" the copy modifies the sub-list "in" the original.

So you need to make your newlist from copies of each of the sublists in the original.

Edit: think of a list of the things in a drawer. Copying the list doesn't copy the contents of the drawer.
Ohh, I see. Thank you for a good explanation!
In case you don't know it already it's maybe worth adding that not only the contents of lists but variables in general are all references (a.k.a. pointers) in Python. This has a visible effect in code like the following:
Python:
>>> a = [1, 2, 3, 4, 5]
>>> b = a
>>> b[2] = 99
>>> a
[1, 2, 99, 4, 5]
This behaviour is also why the code I posted above with the pair variable correctly modifies your original list.

Kolika28
In case you don't know it already it's maybe worth adding that not only the contents of lists but variables in general are all references (a.k.a. pointers) in Python. This has a visible effect in code like the following:
Python:
>>> a = [1, 2, 3, 4, 5]
>>> b = a
>>> b[2] = 99
>>> a
[1, 2, 99, 4, 5]
This behaviour is also why the code I posted above with the pair variable correctly modifies your original list.
Thanks, I really appreciate your help. I tried using the function copy.deepcopy(), and it worked out great!

FactChecker