python3 재귀함수를 사용하여 이와 같이 구현해보려하는데 막혀서 질문드립니다!

조회수 251회

아래와 같이 netsted한 구조를 가진 형식인데

  1. 자기 자신의 부모 값을 가져야 합니다. (최상위 루트는 부모가 자기 자신이니 None입니다!)
  2. 맨 끝 노드까지 찾게된 후 부모 중 리스트인 부모가 있다면 다음 인덱스로 다시 끝까지 찾게 됩니다.
  3. 값이 리스트 일 카운트+1 이 되며(기본 0),
  4. 다음 n+1인덱스도 끝까지 찾아 가게 됩니다! 설명이 다소 부족한 점 이해 부탁드립니다 꾸벅.

example

{
  "a": {
    "a_a": [
      {
        "a_a_a": [
          {
            "a_a_a_a": {
              "a_a_a_a_a": {
                "value": "first value",
                "check": true
              }
            }
          },
          {
            "a_a_a_b": {
              "a_a_a_b_a": {
                "value": "second value",
                "check": true
              }
            }
          }
        ]
      }
    ]
  }
}

result ( 원하는 방향 )

[
    {"id": 1, "field_id": "a | 0",  "parent_id": None, "value": None, "check": False},
    {"id": 2, "field_id": "a_a | 0", "parent_id": 1, "value": None, "check": False},
    {"id": 3, "field_id": "a_a_a | 0", "parent_id": 2, "value": None, "check": False},
    {"id": 4, "field_id": "a_a_a_a | 0", "parent_id": 3, "value": None, "check": False},
    {"id": 5, "field_id": "a_a_a_a_a | 0", "parent_id": 4, "value": "first_value", "check": True},
    {"id": 6, "field_id": "a_a_a | 1", "parent_id": 2, "value": None, "check": False},
    {"id": 7, "field_id": "a_a_a_b | 0", "parent_id": 6, "value": None, "check": False},
    {"id": 8, "field_id": "a_a_a_b_a | 0", "parent_id": 7, "value": "second value", "check": True},
]

시도한 방향

def recursive(request: dict):
    id = uuid.uuid().hex
    serialize = []
    for k, v in request.items():
        if isinstance(v, list):
            for re_list in v:
                recursive(re_list)
        elif isinstance(v, dict):
            recursive(v)
        else:
            serialize.extend(
                id,
                f"{request.get('field_id')} | cnt",
                request.get("parent_id", None),
                request.get("check", False)
            )
    return serialize

1 답변

    1. request.items()로 하셔야 k, v의 리스트를 반환해 줄 겁니다.
    2. dictget메소드는 key를 이용해 value를 가져옵니다. id, field_id, parent_id 모두 key일때 값을 가져올 수 있습니다. 특히 id는 어디에 변수가 선언되어있는지 보이지 않습니다.
    3. 만약 parent_id 값을 가져오고 싶으시다면 def recursive(request: dict, parent_id: int)의 형태로 받아오시는게 좋을 것 같습니다.
    4. serialize 변수를 확장할때 extend 부분이 문제가 있는것 같습니다. serialize.append({"id":"", "field_id": ""})의 형태로 append해주시면 좋을 것 같습니다.
    5. else문에서는 serialize 변수에 값을 추가해주지만, if문과 elif문의 코드에서는 반환된 값을 serialize 변수에 추가해주지 않고 있습니다. 해당 부분에 대해서도 확인해보시면 좋을 것 같습니다.
    • @QbQi 1. request.items()인데 잘못 기입했네요! 윤우섭 2022.10.10 23:54
    • 2. 아 id 가 가독성을 위해서 저렇게 넣었는데 uuid 입니다 ㅠㅠ 이것또한 해결해야하는 과정입니다 윤우섭 2022.10.10 23:57

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)