개요
중복을 허용하고 반복 가능한 데이터에서 특정 데이터 기준으로 등장한 순서를 확인하고 싶다.
예로 들어 실행할 로직명과 설정값이 정의되어 있는 데이터가 있다고 할 때, 각 실행을 구분할 수 있도록 구분자를 추가해야 하는 상황이다. 추가할 구분자는 '실행 로직명_로직 등장 순서' 정도의 형식이면 충분할 것 같다.
반복 가능한 데이터에서 특정 데이터의 수를 세는 것이 아니라서 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
},
]
다음과 같이 처리하면 될 것 같다.
- 처리한 logic 명을 저장할 빈 리스트 list_tmp 선언
- 문자열 데이터를 반복 처리하면서 list_tmp에서 현재 처리할 logic 명의 개수를 idx로 취급한다.
- 처리한 logic 명을 list_tmp에 추가한다.
- 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를 활용하면 데이터 순서가 변경되더라도 원하는 데이터에 접근할 수 있는 것을 확인할 수 있다.