grplist

Groups list items using a compare function


License
MIT
Install
pip install grplist==0.1.4

Documentation

grplist

Groups list items using a compare function.

    groups = grplist([1, 3, 6, 10, 12, 14, 21, 35], lambda a, b: 3 >= abs(a-b), True)

    # groups => [[1, 3, 6], [10, 12, 14], [21], [35]]

Table of contents

 


Install

$ pip3 install grplist

 


Examples

    import grplist as gl
    import numpy as np

    try:
        import sparen
        Log = sparen.Log
    except Exception as e:
        Log = print

    def showBreak():
        print('\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n')

    def test_1():

        showBreak()

        tests = [
            [1, 6, 3],
            [10, 20, 30, 40, 50],
            [1, 3, 6, 10, 12, 14, 21, 35],
            [1, 3, 6, 10, 12, 14, 21, 35, 7, 23],
            [1, 10, 20, 5, 15, 3, 7],
            [1, 10, 20, 30, 40, 35, 32, 5, 11, 2, 3, 16, 17, 12, 33, 34, 35, 33, 3, 42],
            [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
            [1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 21, 22, 23, 24, 25, 26, 27, 28],
            [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
        ]

        for t in tests:

            def cmpVal(a, b):
                test_1.c += 1
                return 3 >= abs(a-b)

            test_1.c = 0
            m = gl.grplist(t, cmpVal, True)
            Log(test_1.c, " : ", t, " -> ", m)

            test_1.c = 0
            m = gl.grplist2(t, cmpVal, True)
            Log(test_1.c, " : ", t, " -> ", m)

    def test_2():

        showBreak()
        a = {'k0': 1, 'k1': 3, 'k2': 6, 'k3': 10, 'k4': 12, 'k5': 14, 'k6': 21, 'k7': 35, 'k8': 7, 'k9': 23}

        m = gl.groupDict(a, lambda a, b: 3 >= abs(a-b), False)
        Log(a, " -> ", m) # [['k0', 'k1', 'k2', 'k3', 'k4', 'k5', 'k8'], ['k6', 'k9'], ['k7']]

        m = gl.groupDict(a, lambda a, b: 3 >= abs(a-b), True)
        Log(a, " -> ", m) # [['k0', 'k1', 'k2'], ['k3', 'k4', 'k5', 'k8'], ['k6', 'k9'], ['k7']]


    # Group letters
    def test_3():

        showBreak()

        def anyLetters(a, b):
            for l in a:
                if 0 <= b.find(l):
                    return True
            return False

        t = ['on', 'tw', 'th', 'fo', 'fi', 'si', 'te', 'zk']
        Log(t, " -> ", gl.grplist2(t, anyLetters, True))


    # Group factors
    def test_4():

        showBreak()

        t = [3, 4, 5, 6, 7, 8, 9, 10]
        Log(t, " -> ", gl.grplist2(t, lambda a, b: not (a % b), True))


    # Group overlapping tracks
    def test_5():

        showBreak()

        def showTracks(t, bs, es):
            n = 0
            print(' : 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8')
            for i in t:
                s = (' ' * i[bs]) + ('-' * (i[es] - i[bs] + 1))
                s = '|'.join(s.replace('-', '|', 1).rsplit('-', 1))
                print("%s: %s" % (n, s))
                n += 1

        t = [
            {'beg': 2,  'end': 10},
            {'beg': 20, 'end': 25},
            {'beg': 4,  'end': 7},
            {'beg': 30, 'end': 35},
            {'beg': 8,  'end': 17},
            {'beg': 22, 'end': 28},
            {'beg': 33, 'end': 45},
            {'beg': 1,  'end': 4},
            # {'beg': 0,  'end': 74},
        ]

        print("\n--- INPUT ---")
        showTracks(t, 'beg', 'end')

        g = gl.grplist2(t, lambda a, b: a['beg'] <= b['end'] and a['end'] >= b['beg'], True)

        i = 0
        for t in g:
            i += 1
            print("\n--- GROUP %s ---" % i)
            showTracks(t, 'beg', 'end')


    def main():
        test_1()
        test_2()
        test_3()
        test_4()
        test_5()


    if __name__ == '__main__':
        main()

Output

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    3  :  [1, 6, 3]  ->  [[1, 6, 3]]
    3  :  [1, 6, 3]  ->  [[1, 3, 6]]
    10  :  [10, 20, 30, 40, 50]  ->  [[10], [20], [30], [40], [50]]
    10  :  [10, 20, 30, 40, 50]  ->  [[10], [20], [30], [40], [50]]
    28  :  [1, 3, 6, 10, 12, 14, 21, 35]  ->  [[1, 3, 6], [10, 12, 14], [21], [35]]
    28  :  [1, 3, 6, 10, 12, 14, 21, 35]  ->  [[1, 3, 6], [10, 12, 14], [21], [35]]
    45  :  [1, 3, 6, 10, 12, 14, 21, 35, 7, 23]  ->  [[1, 3, 6, 10, 12, 14, 7], [21, 23], [35]]
    43  :  [1, 3, 6, 10, 12, 14, 21, 35, 7, 23]  ->  [[1, 3, 6, 7, 10, 12, 14], [35], [21, 23]]
    21  :  [1, 10, 20, 5, 15, 3, 7]  ->  [[20], [1, 10, 5, 3, 7], [15]]
    21  :  [1, 10, 20, 5, 15, 3, 7]  ->  [[1, 3, 5, 7, 10], [15], [20]]
    190  :  [1, 10, 20, 30, 40, 35, 32, 5, 11, 2, 3, 16, 17, 12, 33, 34, 35, 33, 3, 42]  ->  [[1, 5, 2, 3, 3], [10, 11, 12], [20, 16, 17], [30, 35, 32, 33, 34, 35, 33], [40, 42]]
    172  :  [1, 10, 20, 30, 40, 35, 32, 5, 11, 2, 3, 16, 17, 12, 33, 34, 35, 33, 3, 42]  ->  [[1, 3, 3, 2, 5], [10, 12, 11], [20, 17, 16], [30, 33, 33, 35, 34, 32, 35], [40, 42]]
    153  :  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]  ->  [[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]]
    57  :  [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]  ->  [[1, 4, 7, 10, 13, 16, 18, 17, 15, 14, 12, 11, 9, 8, 6, 5, 3, 2]]
    153  :  [1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 21, 22, 23, 24, 25, 26, 27, 28]  ->  [[1, 2, 3, 4, 5, 6, 7, 8, 9], [20, 21, 22, 23, 24, 25, 26, 27, 28]]
    111  :  [1, 2, 3, 4, 5, 6, 7, 8, 9, 20, 21, 22, 23, 24, 25, 26, 27, 28]  ->  [[1, 4, 7, 9, 8, 6, 5, 3, 2], [20, 23, 26, 28, 27, 25, 24, 22, 21]]
    210  :  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]  ->  [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]
    20  :  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]  ->  [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    {'k0': 1, 'k1': 3, 'k2': 6, 'k3': 10, 'k4': 12, 'k5': 14, 'k6': 21, 'k7': 35, 'k8': 7, 'k9': 23}  ->  [['k0', 'k1', 'k2', 'k3', 'k4', 'k5', 'k8'], ['k6', 'k9'], ['k7']]
    {'k0': 1, 'k1': 3, 'k2': 6, 'k3': 10, 'k4': 12, 'k5': 14, 'k6': 21, 'k7': 35, 'k8': 7, 'k9': 23}  ->  [[1, 3, 6, 10, 12, 14, 7], [21, 23], [35]]

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    ['on', 'tw', 'th', 'fo', 'fi', 'si', 'te', 'zk']  ->  [['on', 'fo', 'fi', 'si'], ['tw', 'te', 'th'], ['zk']]

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    [3, 4, 5, 6, 7, 8, 9, 10]  ->  [[3, 9, 6], [4, 8], [5, 10], [7]]

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -


    --- INPUT ---
    : 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8
    0:   |-------|
    1:                     |----|
    2:     |--|
    3:                               |----|
    4:         |--------|
    5:                       |-----|
    6:                                  |-----------|
    7:  |--|

    --- GROUP 1 ---
    : 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8
    0:   |-------|
    1:  |--|
    2:         |--------|
    3:     |--|

    --- GROUP 2 ---
    : 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8
    0:                     |----|
    1:                       |-----|

    --- GROUP 3 ---
    : 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8
    0:                               |----|
    1:                                  |-----------|

 


References