How can I multiply elements in nested lists in Python and print the new list?

  • Python
  • Thread starter Kolika28
  • Start date
  • Tags
    List Python
In summary: Lastly, using descriptive variable names instead of common words like "sum" can help avoid potential conflicts. In summary, the conversation discusses methods for multiplying the last element in a list with a given number and printing the new list. It is recommended to use a for loop to iterate through the list and work with the inner list, and to avoid using common names for variables. It is also important to make a copy of the original list and modify the copy, rather than the original, to avoid unintended changes. Additionally, using different data structures, such as tuples, can also help avoid issues.
  • #1
Kolika28
146
28
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:
Technology news on Phys.org
  • #2
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
jedishrfu said:
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
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
Because your inner list has only two elements and you know you want the change a specific one then there's 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
Python:
for pair in mylist:
    pair[1] *= 5
 
  • Like
Likes Kolika28, FactChecker and jedishrfu
  • #7
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
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
Kolika28 said:
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
Ibix said:
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
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
Kolika28 said:
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
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
Ibix said:
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!
wle said:
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
Kolika28 said:
Ibix said:
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
wle said:
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

FAQ: How can I multiply elements in nested lists in Python and print the new list?

1. How do I access elements in nested lists in Python?

In order to access elements in nested lists, you can use the indexing notation. For example, if you have a nested list called "my_list" with two lists inside, you can access the first element of the first list by using my_list[0][0], and the second element of the second list by using my_list[1][1].

2. What is the best way to multiply elements in nested lists in Python?

The best way to multiply elements in nested lists in Python is by using nested for loops. This allows you to iterate through each list and access the elements individually, perform the multiplication, and store the results in a new list.

3. How can I check if an element in a nested list is a number or a list?

You can use the isinstance() function in Python to check the type of an element. This function takes two parameters: the element you want to check and the data type you want to check against. For example, isinstance(my_list[0][0], int) will return True if the first element of the first list in my_list is an integer.

4. Can I use list comprehensions to multiply elements in nested lists in Python?

Yes, list comprehensions can also be used to multiply elements in nested lists in Python. However, it may be more difficult to read and understand compared to using nested for loops.

5. How can I print the new list after multiplying elements in nested lists in Python?

After multiplying the elements in nested lists, you can simply use the print() function to print out the new list. You can also use a for loop to iterate through the new list and print each element individually.

Similar threads

Replies
2
Views
818
Replies
4
Views
1K
Replies
3
Views
677
Replies
43
Views
3K
Replies
29
Views
2K
Replies
4
Views
4K
Replies
3
Views
1K
Replies
7
Views
2K
Replies
9
Views
1K
Back
Top