File size: 2,484 Bytes
a57c6eb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
from typing import List, Dict, Sequence, Union, Tuple, Any, Hashable

import numpy as np


def pick_subdct(src: Dict[Hashable, Any], target_keys: List[str] = None, ignored_keys: List[str] = None) -> Dict[Hashable, Any]:
    """提取字典中的目标子字典

    Args:
        src (Dict[Hashable, Any]): 原字典
        target_keys (List[str], optional): 目标key. Defaults to None.
        ignored_keys (List[str], optional): 忽略的key. Defaults to None.

    Returns:
        Dict[Hashable, Any]: 子字典
    """
    dst = {}
    if target_keys is not None:
        for k in target_keys:
            if k in src:
                dst[k] = src[k]
    if ignored_keys is not None:
        for k in src:
            if k not in ignored_keys:
                dst[k] = src[k]
    return dst


def str2intlist(string: str, sep: str="_", range_sep: str=":", discrete_sep=",") -> List[int]:
    """将1:2_3:4_5,6,7的字符串转化成整数索引列表,方便取子任务, 左闭右比

    Args:
        string (str): 输入字符串

    Returns:
        List: 转化后的整数列表
    """
    string = string.split(sep)
    lst = []
    for s in string:
        if range_sep in s:
            # 采用左闭、右闭方式
            start, end = [int(x) for x in s.split(range_sep)]
            sub_lst = range(start, end + 1)
        else:
            sub_lst = [int(x) for x in s.split(discrete_sep)]
        lst.extend(sub_lst)
    lst = sorted(set(lst))
    return lst


def dict_has_keys(dct: Dict[Hashable, Any], keys: List[Union[str, int]]) -> bool:
    """嵌套字典是否有嵌套key

    Args:
        dct (Dict[Hashable, Any]): 有多层嵌套的字典
        keys (List[Union[str, int]]): 字符串列表,从前往后表示嵌套字典key

    Returns:
        bool: dct是否有keys
    """
    if keys[0] not in dct:
        # if not hasattr(dct, keys[0]):
        return False
    else:
        if len(keys) == 1:
            return True
        else:
            return dict_has_keys(dct[keys[0]], keys[1:])


def dict_get_keys(dct: Dict[Hashable, Any], keys: List[Union[str, int]]) -> Any:
    """根据索引列表获取嵌套字典的值

    Args:
        dct (Dict[Hashable, Any]): 嵌套字典
        keys (List[Union[str, int]]): 用列表表示的嵌套索引

    Returns:
        Any: 嵌套索引keys对应的值
    """
    if len(keys) == 1:
        return dct[keys[0]]
    else:
        return dict_get_keys(dct[keys[0]], keys[1:])