I'm getting mad with list indexes, and can't explain what I'm doing wrong.
I have this piece of code in which I want to create a list of lists, each one containing values of the same circuit parameter (voltage, current etc..) that I'm reading from a csv
file that looks like this:
Sample, V1, I1, V2, I2 0, 3, 0.01, 3, 0.02 1, 3, 0.01, 3, 0.03
And so on. What I want is to create a list that for example contains V1 and I1 (but I want to chose interactively) in the form [[V1], [I1]], so:
[[3,3], [0.01, 0.01]]
The code that I'm using is this:
plot_data = [[]]*len(positions) for row in reader: for place in range(len(positions)): value = float(row[positions[place]]) plot_data[place].append(value)
plot_data
is the list that contains all the values, while positions
is a list with the indexes of the columns that I want to copy from the .csv
file. The problem is that if I try the commands in the shell, seems to work, but if I run the script instead of appending each value to the proper sub-list, it appends all values to all lists, so I obtain 2 (or more) identical lists.
💡 Tips: When you use . append() the original list is modified. The method does not create a copy of the list – it mutates the original list in memory.
Method #1 : Using * operator We can employ * operator to multiply the occurrence of the particular value and hence can be used to perform this task of adding value multiple times in just a single line and makes it readable. # adds 3, 50 times.
extend to extend the list by multiple values from any kind of iterable, being it another list or any other thing that provides a sequence of values. So you can use list. append() to append a single value, and list. extend() to append multiple values.
Python lists are mutable objects and here:
plot_data = [[]] * len(positions)
you are repeating the same list len(positions)
times.
>>> plot_data = [[]] * 3 >>> plot_data [[], [], []] >>> plot_data[0].append(1) >>> plot_data [[1], [1], [1]] >>>
Each list in your list is a reference to the same object. You modify one, you see the modification in all of them.
If you want different lists, you can do this way:
plot_data = [[] for _ in positions]
for example:
>>> pd = [[] for _ in range(3)] >>> pd [[], [], []] >>> pd[0].append(1) >>> pd [[1], [], []]
import csv cols = [' V1', ' I1'] # define your columns here, check the spaces! data = [[] for col in cols] # this creates a list of **different** lists, not a list of pointers to the same list like you did in [[]]*len(positions) with open('data.csv', 'r') as f: for rec in csv.DictReader(f): for l, col in zip(data, cols): l.append(float(rec[col])) print data # [[3.0, 3.0], [0.01, 0.01]]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With