Coverage for src/extratools_core/dicttools.py: 0%

18 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-04-06 00:04 -0700

1from collections import defaultdict 

2from collections.abc import Iterable, Mapping, Sequence 

3 

4 

5def invert[KT, VT](d: Mapping[KT, VT]) -> Mapping[VT, KT]: 

6 return { 

7 v: k 

8 for k, v in d.items() 

9 } 

10 

11 

12def invert_safe[KT, VT](d: Mapping[KT, VT]) -> Mapping[VT, Sequence[KT]]: 

13 r: defaultdict[VT, list[KT]] = defaultdict(list) 

14 

15 for k, v in d.items(): 

16 r[v].append(k) 

17 

18 return r 

19 

20 

21def inverted_index[T]( 

22 seqs: Iterable[Sequence[T]], 

23) -> Mapping[T, Sequence[tuple[int, Sequence[int]]]]: 

24 index: defaultdict[T, list[tuple[int, list[int]]]] = defaultdict(list) 

25 

26 for i, seq in enumerate(seqs): 

27 seq_index: defaultdict[T, list[int]] = defaultdict(list) 

28 for j, item in enumerate(seq): 

29 seq_index[item].append(j) 

30 

31 for item, poss in seq_index.items(): 

32 index[item].append((i, poss)) 

33 

34 return index