Algorithm

중복/반복 가능한 데이터에서 데이터의 등장 순서 확인

비번변경 2023. 12. 11. 15:29

개요

중복을 허용하고 반복 가능한 데이터에서 특정 데이터 기준으로 등장한 순서를 확인하고 싶다.

 

예로 들어 실행할 로직명과 설정값이 정의되어 있는 데이터가 있다고 할 때, 각 실행을 구분할 수 있도록 구분자를 추가해야 하는 상황이다. 추가할 구분자는 '실행 로직명_로직 등장 순서' 정도의 형식이면 충분할 것 같다.

 

반복 가능한 데이터에서 특정 데이터의 수를 세는 것이 아니라서 count 등의 함수는 사용할 수 없을 것 같아, 구현한 내용을 간단히 정리해 둔다. 사용한 프로그래밍 언어는 Python이다.

 

 

값 예시

처리할 데이터 예시는 아래와 같다. 실행할 로직명과 처리 데이터의 시작 시점, 처리 데이터의 종료 시점으로 구성되어 있다.

washer_filter, 2023-11-17 03:00:00, 2023-11-17 05:00:00
washer_filter, 2023-11-17 06:00:00, 2023-11-17 07:00:00
ref_weak,2023-11-15 06:00:00,2023-11-16 07:00:00
ref_hourly,2023-11-17 06:00:00,2023-11-17 07:00:00
ref_weak,2023-11-16 08:00:00,2023-11-17 07:00:00
ref_weak,2023-11-17 08:00:00,2023-11-18 07:00:00

각 데이터는 구분하기 좋도록 딕셔너리로 구성된 리스트로 처리할 것이다.

 

예시 )

[
  {
    'logic': 'washer_filter',
    'start_dt': '2023-11-17 03:00:00',
    'end_dt': '2023-11-17 05:00:00'
  },
  {
    'logic': 'washer_filter',
    'start_dt': '2023-11-17 06:00:00',
    'end_dt': '2023-11-17 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'start_dt': '2023-11-15 06:00:00',
    'end_dt': '2023-11-16 07:00:00'
  },
  {
    'logic': 'ref_hourly',
    'start_dt': '2023-11-17 06:00:00',
    'end_dt': '2023-11-17 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'start_dt': '2023-11-16 08:00:00',
    'end_dt': '2023-11-17 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'start_dt': '2023-11-17 08:00:00',
    'end_dt': '2023-11-18 07:00:00'
  }
]

 

처리 코드

list_data = []
for str_d in data.strip().split('\n'):
    list_d = str_d.split(',')
    list_data.append({
        "logic": list_d[0].strip(),
        "start_dt" : list_d[1].strip(),
        "end_dt": list_d[2].strip(),
    })

 

 

등장 순서 조회

위와 같은 데이터가 존재할 때, logic 별 등장 순서를 의미하는 idx 속성을 추가하고자 한다.

[
  {
    'logic': 'washer_filter',
    'start_dt': '2023-11-17 03:00:00',
    'end_dt': '2023-11-17 05:00:00',
    'idx' : 0
  },
  {
    'logic': 'washer_filter',
    'start_dt': '2023-11-17 06:00:00',
    'end_dt': '2023-11-17 07:00:00',
    'idx' : 1
  },
]

 

다음과 같이 처리하면 될 것 같다.

  1. 처리한 logic 명을 저장할 빈 리스트 list_tmp 선언
  2. 문자열 데이터를 반복 처리하면서 list_tmp에서 현재 처리할 logic 명의 개수를 idx로 취급한다.
  3. 처리한 logic 명을 list_tmp에 추가한다.
  4. 2 ~ 3 과정을 반복한다.

 

수정 코드

list_data = []
list_tmp = []
for str_d in data.strip().split('\n'):
    list_d = str_d.split(',')
    logic = list_d[0].strip()
    list_data.append({
        "logic": logic,
        "idx": list_tmp.count(logic),
        "start_dt" : list_d[1].strip(),
        "end_dt": list_d[2].strip(),
    })
    list_tmp.append(logic)

print(sorted(list_data, key=lambda x: x['logic']))

 

실행 결과

[
  {
    'logic': 'ref_hourly',
    'idx': 0,
    'start_dt': '2023-11-17 06:00:00',
    'end_dt': '2023-11-17 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'idx': 0,
    'start_dt': '2023-11-15 06:00:00',
    'end_dt': '2023-11-16 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'idx': 1,
    'start_dt': '2023-11-16 08:00:00',
    'end_dt': '2023-11-17 07:00:00'
  },
  {
    'logic': 'ref_weak',
    'idx': 2,
    'start_dt': '2023-11-17 08:00:00',
    'end_dt': '2023-11-18 07:00:00'
  },
  {
    'logic': 'washer_filter',
    'idx': 0,
    'start_dt': '2023-11-17 03:00:00',
    'end_dt': '2023-11-17 05:00:00'
  },
  {
    'logic': 'washer_filter',
    'idx': 1,
    'start_dt': '2023-11-17 06:00:00',
    'end_dt': '2023-11-17 07:00:00'
  }
]

이제 logic 명과 idx를 활용하면 데이터 순서가 변경되더라도 원하는 데이터에 접근할 수 있는 것을 확인할 수 있다.