[Pythhon] 중첩된 사전과 진열의 각 값을 반복적으로 처리할 때의 코드 샘플을 원합니다

12215 단어 Python귀속tech
끼워 넣은 사전을 귀속 처리하고 싶은 장면이 있으니 필기를 해야 한다.

코드 샘플


먼저 고급 함수를 만듭니다.create_recursive_action는 수신값의 판정함수와 이 판정함수가 적용될 때 진행되는 함수로 귀속적으로 처리하는 함수이다.
def create_recursive_action(is_target: Callable[[any], bool], action: Callable[[any], any]) -> Callable[[Union[dict, list]], Union[dict, list]]:
    def is_dict_or_list(obj: any) -> bool:
        return isinstance(obj, dict) or isinstance(obj, list)

    def inner(obj: Union[dict, list]) -> Union[
    dict, list]:
        if isinstance(obj, dict):
            return {
                k: action(v) if is_target(v) else inner(v) if is_dict_or_list(v) else v
                for k, v in obj.items()
            }
        if isinstance(obj, list):
            return [
                action(v) if is_target(v) else inner(v) if is_dict_or_list(v) else v
                for v in obj
            ]
    return inner
그리고 lambda를 통해 목표 함수를 만듭니다.
다음은 주어진 사전을 반복적으로 스캔하고, 수치가 문자열이면 upper () 를 적용하는 예입니다.
recursive_upper_case = create_recursive_action(lambda obj: isinstance(obj, str), lambda obj: obj.upper())

recursive_upper_case({
    'dict': {
        'str': 'aaa',
        'dict': {
            'str': 'aaa',
            'num': 1,
            'bool': True

        },
    },
    'list': [
        'bbb',
        {
            'dict': {
                'str': 'aaa',
                'num': 1,
                'bool': True
            },
        }
    ]
})
# {'dict': {'str': 'AAA',  'num': 1,  'bool': True,  'dict': {'str': 'AAA', 'num': 1, 'bool': True}}, 'list': ['BBB', {'dict': {'str': 'AAA', 'num': 1, 'bool': True}}]}
사용자가 입력한 태그 등을 삭제하는 것도 편리하다.
from django.utils.html import strip_tags

recursive_strip_tags = create_recursive_action(lambda obj: isinstance(obj, str), lambda obj: strip_tags(obj))

recursive_strip_tags({
  'payload': [
    { 'text': '<b>aaa</b>' }
    { 'text': '<b>bbb>' }
    [
      { 'text': '<b>ccc</b>' }
      { 'text': '<b>ddd</b>' }
    ]
  ]
})
# { 'payload': [ { 'text': 'aaa', { 'text': 'bbb' }, [ { 'text': 'ccc' }, { 'text', 'ddd' }]}]}

좋은 웹페이지 즐겨찾기