Search code examples
pythonlistiterationenumerationindices

Python keeping track of indices in lists at certain points


I'm having some trouble with iteration and keeping track of various indices and values at different points in my list (I'm new to Python).

I am running a series of cycles, but want to determine their starts and end times. Experiments starts at around 0 and end at around 50.

Here is what a list of cycles look like:

c = [0, 10, 11, 48, 50.5, 0.48, 17, 18, 23, 29, 33, 34.67, 50.1, 0.09, 7, 41, 45, 50]

Here is an example of what the output should look like:

C 1:
Start: (0, 0) # starts at index 0, value 0
End: (4, 50.5) #ends at index 4, value 50.5

C 2:
Start: (5, 0.48)
End: (12, 50.1)

C 3:
Start: (13, 0.09)
End: (17, 50)

One approach I can think of is to sort the c.

c.sort()

This will at least put all the start values at the beginning of the list and the end values at the end of the list. However, then I would lose track of their original indices. Anyone know of another approach?

EDIT:

This is what I have so far, if anyone can help modify, it would be great:

min = []
max = []
for i, (first,second) in enumerate(zip(c, c[1:])):
    print(i, first, second)
    if first < second:
        min.append(first)
        continue
    if first > second:
        max.append(first)
        continue

Solution

  • I divide up the task, build a dictionary, D of the increasing sequences

    c = [0, 10, 11, 48, 50.5, 0.48, 17, 18, 23, 29, 33, 34.67, 50.1, 0.09, 7, 41, 45, 50]
    
    D, k = {0: []}, 0
    
    for i, (first, second) in enumerate(zip(c, [0] + c)):
        if first >= second:
            D[k].append((i, first))  # adding increasing to value list in current D[k]
        else:
            k += 1
            D[k] = [(i, first)]  # initializing new D[k] for next sequence
    

    then print in the desired format

    for k in D:  # sorted(D) safer, dict doesn't guarantee ordering, works here  
        print('C {0}:'.format(k))
        print('Start {0}'.format(D[k][0]))
        print('End   {0}'.format(D[k][-1]), '\n')
    
    C 0:
    Start (0, 0)
    End   (4, 50.5) 
    
    C 1:
    Start (5, 0.48)
    End   (12, 50.1) 
    
    C 2:
    Start (13, 0.09)
    End   (17, 50) 
    

    to print the dict D nicely in my IDE I needed wider line limit

    import pprint
    
    pp = pprint.PrettyPrinter(width=100)
    pp.pprint(D)
    
    {0: [(0, 0), (1, 10), (2, 11), (3, 48), (4, 50.5)],
     1: [(5, 0.48), (6, 17), (7, 18), (8, 23), (9, 29), (10, 33), (11, 34.67), (12, 50.1)],
     2: [(13, 0.09), (14, 7), (15, 41), (16, 45), (17, 50)]}