List with lists in Python

  • Thread starter Kolika28
  • Start date
  • #1
142
26
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:

Answers and Replies

  • #2
12,101
5,780
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.
 
  • #3
142
26
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
2.PNG
 
  • #4
FactChecker
Science Advisor
Gold Member
5,790
2,157
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:
  • Like
Likes Kolika28
  • #5
12,101
5,780
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.
 
  • Like
Likes Kolika28 and FactChecker
  • #6
wle
316
139
Python:
for pair in mylist:
    pair[1] *= 5
 
  • Like
Likes Kolika28, FactChecker and jedishrfu
  • #7
142
26
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.
 
  • #8
Ibix
Science Advisor
Insights Author
6,933
5,844
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.
 
  • #9
Ibix
Science Advisor
Insights Author
6,933
5,844
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.
 
  • Like
Likes Kolika28
  • #10
142
26
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...
 
  • #11
FactChecker
Science Advisor
Gold Member
5,790
2,157
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.
 
  • Like
Likes Ibix
  • #12
Ibix
Science Advisor
Insights Author
6,933
5,844
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.
 
  • Like
Likes Kolika28 and FactChecker
  • #13
wle
316
139
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]
 
  • #14
142
26
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!
 
  • #15
wle
316
139
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.
 
  • Like
Likes Kolika28
  • #16
142
26
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!
 
  • Like
Likes FactChecker

Related Threads on List with lists in Python

Replies
9
Views
740
Replies
3
Views
779
  • Last Post
Replies
1
Views
10K
Replies
8
Views
636
  • Last Post
Replies
12
Views
3K
  • Last Post
Replies
9
Views
4K
  • Last Post
Replies
2
Views
2K
  • Last Post
Replies
9
Views
4K
Replies
6
Views
6K
  • Last Post
Replies
1
Views
3K
Top