Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appending items to a list of lists in python [duplicate]

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.

like image 651
clabacchio Avatar asked Jan 03 '12 14:01

clabacchio


People also ask

Does list append make a copy?

💡 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.

How do you add duplicates to a list in Python?

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.

Can you append multiple items to a list Python?

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.


2 Answers

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], [], []] 
like image 119
joaquin Avatar answered Sep 27 '22 20:09

joaquin


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]] 
like image 44
eumiro Avatar answered Sep 27 '22 18:09

eumiro