[Tutor] question already discussed with oscar benjamin

Oscar Benjamin oscar.j.benjamin at gmail.com
Thu May 16 12:00:05 CEST 2013


On 7 May 2013 21:10, Linsey Raaijmakers <lm.raaijmakers at gmail.com> wrote:
> Hi,
>
> Im trying to work with the help Oscar provided me, but I still get stuck :(

For the benefit of everyone else here, this is referring to a question
that was asked on python-list. The discussion there went off-list and
I recommended that it take place on-list but on this list instead of
python-list.

> So what I'm trying to do now is write the program with the following input
> and output:

The input/output specification below was my own suggestion of a
subproblem to solve. The idea is that actions with integer identifiers
have integer start/apex/end times and the program should read a file
containing those and identify when actions are occurring
simultaneously. The events in the file appear in order of start time.

> Input:
> action,start,apex,stop
> 3, 12, 13, 15
> 4, 15, 15, 15
> 3, 20, 21, 25
> 5, 21, 23, 30
> ...
>
> And when you run your program it prints out:
> actions, start, stop
> [3], 12, 13
> [], 14,15
> [4], 15, 15
> [], 16, 19
> [3], 20, 21
> [3, 5], 21, 21
> [5], 22, 23
> ...
>
> I don't want to use the stop. Only the start till apex is important.
>
> This is the code I have now:

Not it's not. This code doesn't work. Can you post a complete program
that actually runs rather than just a segment of it? See here:
http://sscce.org/

>
> now = onset_list[0]
> end = apex_list[0]
> active = action_list[0]
>
> for i in range(1,len(onset_list)):
>   next_start = onset_list[i]
>   next_end = apex_list[i]
>   next_active = action_list[i]
>   prev_end = apex_list[i-1]
>
>   while next_start > end:
>     print active+"\t"+now+'\t'+end
>     end = next_end
>     now = next_start
>     active = next_active
>   print active+','+next_active+'\t'+now+'\t'+next_end

This will just print each event and the following event. That is not
what you want. You need to keep a list of currently active events and
as you loop forward through the times you should remove events that
have finished and add events that have started.

> But my output will print now:
>
> 3    12    13
> 4,4  15    15
> 4     15    15
> 3,3   20    21
> 3,5   20    25
>
> How do I fix that it doesn't print out the double ones?

The problem is not that it prints the double ones. The problem is that
it does not keep track of a list of currently active events. I'll make
the problem a bit simpler: make a program that gives the following
input/output.

Input:
action,start,apex,stop
3, 12, 13, 15
4, 15, 15, 15
3, 20, 21, 25
5, 21, 23, 30
...

And when you run your program it prints out:
actions, time
[3], 12
[3], 13
[], 14
[4], 15
[], 16
[], 17
[], 18
[], 19
[3], 20
[3, 5], 21
[5], 22
[5], 23
...

The first column in this output is the list of active events at the
times given in the second column. Your code will need to actually have
a list that it adds and removes from as events start and stop


Oscar


More information about the Tutor mailing list