make sublists of a list broken at nth certain list items

CM cmpython at gmail.com
Mon Jul 8 16:52:40 EDT 2013


I'm looking for a Pythonic way to do the following:

I have data in the form of a long list of tuples.  I would like to break that list into four sub-lists.  The break points would be based on the nth occasion of a particular tuple.  (The list represents behavioral data trials; the particular tuple represents the break between trials; I want to collect 20 trials at a time, so every 20th break between trials, start a new sublist).

So say I have this data:  

data_list = [(0.0, 1.0), (1.0, 24.0), (24.0, 9.0), (9.0, 17.0), (17.0, 5.0), (5.0, 0.0), (5.0, 0.0), (5.0, 24.0), (24.0, 13.0), (13.0, 0.0), (13.0, 21.0), (21.0, 0.0), (21.0, 0.0), (21.0, 23.0), (23.0, 24.0), (24.0, 10.0), (10.0, 18.0), (18.0, 4.0), (4.0, 22.0), (22.0, 1.0), (1.0, 0.0), (1.0, 24.0), (24.0, 6.0), (6.0, 14.0), (14.0, 5.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 0.0), (5.0, 24.0), (24.0, 6.0), (6.0, 14.0), (14.0, 4.0), (4.0, 0.0), (4.0, 22.0), (22.0, 1.0), (1.0, 0.0), (1.0, 24.0), (24.0, 9.0), (9.0, 17.0), (17.0, 4.0), (4.0, 0.0), (4.0, 22.0), (22.0, 1.0), (1.0, 0.0), (1.0, 0.0), (1.0, 24.0), (24.0, 12.0), (12.0, 4.0), (4.0, 0.0), (4.0, 22.0)]  #rest of data truncated...

I'd like to break the list into sublists at the 20th, 40th, and 60th occasions of any tuple that begins with 1.0--so for example, (1.0, 0.0).  This will produce four sub-lists, for trial 1-20, 21-40, 41-60, and 61-80.

What I have, just to get the break points within the data_list, and which is not working is:

trial_break_indexes_list = []  #needed to see where the sublists start
trial_count = 0  #keep count of which trial we're on

trial_break_indexes_list = []  #holds the index of the transitions_list for trials 1-20, 21-40, 41-60, and 61-80
trial_count = 0

for tup in data_list:
    if tup[0] == 1.0: #Therefore the start of a new trial

        #We have a match!  Therefore get the index in the data_list
        data_list_index = data_list.index(tup)

        trial_count += 1  #update the trial count.

        if trial_count % 20 == 0:  #this will match on 0, 20, 40, 60, 80
            trial_break_indexes_list.append(data_list_index)

print 'This is trial_break_indexes_list: ', trial_break_indexes_list

Unfortunately, the final output here is:

>>> 
This is trial_break_indexes_list:  [1, 20, 20, 20, 20, 1, 20, 1]

I sense there is a way more elegant/simpler/Pythonic way to approach this, let alone one that is actually correct, but I don't know of it.  Suggestions appreciated!

Thanks.



More information about the Python-list mailing list