make sublists of a list broken at nth certain list items

C

CM

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

Fábio Santos

You don't want to use index() to figure out the index of the tuples. It is
slower, and will not find the item you want if there is more than one of
the same. For example,

[1, 4, 4, 4].index(4)

will always be 1, no matter how many times you loop through it.

Instead, use enumerate() to keep track of the index. Replace your loop by:

for index, tup in enumerate(data_list):

This should fix your problem. After you have the correct indices, look into
list slicing syntax.
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,731
Messages
2,569,432
Members
44,835
Latest member
KetoRushACVBuy

Latest Threads

Top