File size: 1,807 Bytes
6fc43ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
from typing import Any, Self, overload


class lddl:
    ''' ... '''
    def __init__(self) -> None:
        ''' ... '''
        self.dat_ld: list[dict[str, Any]] = None
        self.dat_dl: dict[str, list[Any]] = None

    @overload
    def __getitem__(self, idx: int) -> dict[str, Any]: ...

    @overload
    def __getitem__(self, idx: str) -> list[Any]: ...

    def __getitem__(self, idx: str | int) -> list[Any] | dict[str, Any]:
        ''' ... '''
        if isinstance(idx, str):
            return self.dat_dl[idx]
        elif isinstance(idx, int):
            return self.dat_ld[idx]
        else:
            raise TypeError('Unexpected key type: {}'.format(type(idx)))

    @classmethod
    def from_ld(cls, dat: list[dict[str, Any]]) -> Self:
        ''' Construct from list of dicts. '''
        obj = cls()
        obj.dat_ld = dat
        obj.dat_dl = {k: [dat[i][k] for i in range(len(dat))] for k in dat[0]}
        return obj

    @classmethod
    def from_dl(cls, dat: dict[str, list[Any]]) -> Self:
        ''' Construct from dict of lists. '''
        obj = cls()
        obj.dat_ld = [dict(zip(dat, v)) for v in zip(*dat.values())]
        obj.dat_dl = dat
        return obj
    

if __name__ == '__main__':
    ''' for testing purpose only '''
    dl = {
        'a': [0, 1, 2],
        'b': [3, 4, 5],
    }

    ld = [
        {'a': 0, 'b': 1, 'c': 2},
        {'a': 3, 'b': 4, 'c': 5},
    ]

    # test constructing from ld
    dat_ld = lddl.from_ld(ld)
    print(dat_ld.dat_ld)
    print(dat_ld.dat_dl)

    # test constructing from dl
    dat_dl = lddl.from_dl(dl)
    print(dat_dl.dat_ld)
    print(dat_dl.dat_dl)

    # test __getitem__
    print(dat_dl['a'])
    print(dat_dl[0])

    # mouse hover to check if type hints are correct
    v = dat_dl['a']
    v = dat_dl[0]