2022. 5. 6. 21:30ㆍ분석 Python/구현 및 자료
이름을 어떻게 해야 할지 모르겠지만, 일단 시작하면 다음과 같은 문제가 있었다.
2개의 list가 있는 데 하나는 그냥 list고 하나는 nested 형태의 list이다.
이 안에는 idx가 있고, 이 nested list에도 idx를 묶어 놓은 list들이 있다.
이 2개를 합치는 작업이 필요해서 고민하다가 나온 결과를 공유한다.
다음과 같은 예시가 있다고 하자.
_list = [0,1,5,12,16]
_nested_list = [[2,3,4],[6,7,8],[9,10,11],[13,14,15]]
나의 목적은 이 2개를 순서를 유지하면서 합치는 것이 목표이다.
[0, 1, [2, 3, 4], 5, [6, 7, 8], [9, 10, 11], 12, [13, 14, 15], 16]
위와 같이 idx의 순서를 비교해서 합치는 작업이 필요했다.
그래서 고민을 하다 보니 얻은 결과는 다음과 같다.
일단 기존에 _list에다가 _nested_list가 들어갈 영역을 미리 만들어주기 위해서 nested_list안에 각 list에서 가장 작은 idx를 뽑았다.
_min_idx_nested_list = [sub_list[0] for sub_list in _nested_list ]
# [2, 6, 9, 13]
그리고 이것을 기존에 있던 list와 결합하고 정렬을 해서 위치를 확보했다.
total_list = sorted(_list + _min_idx_nested_list)
# [0, 1, 2, 5, 6, 9, 12, 13, 16]
그리고 위치를 찾기 위해서 새로운 array를 만들었다.
total_arr = np.array(sorted(_list + _min_idx_nested_list))
그다음에는 _min_idx_nested_list를 이용해서 해당 값이 전체 array에서 어디 있는 지를 확인하고 그 값을 변경해주는 작업을 했다.
예를 들어 2라는 값이 있으면 _nested_list에서는 첫 번째 위치에 있는 첫 번째 인덱스를 가져오고,
array에서는 2가 있는 실제 위치를 찾는다.
그리고 가서 total_list에서 실제 위치에 실제 값을 넣어주는 코드를 구성했다.
for idx , i in enumerate(_min_idx_nested_list) :
list_ = _nested_list[idx]
_idx = int(np.where(total_arr == i)[0])
total_list[_idx] = list_
total_list
# [0, 1, [2, 3, 4], 5, [6, 7, 8], [9, 10, 11], 12, [13, 14, 15], 16]
이런 식으로 구성하면, 순서를 유지하는 nested_list를 만들 수 있게 된다.
더 좋은 방법이 있다면 공유해주시길 바랍니다 :)
다른 방법 (daewonyoon 님의 아이디어)
lambda를 이용하면 더 쉽게 할 수 있다!
>>> _list = [0,1,5,12,16]
>>> _nested_list = [[2,3,4],[6,7,8],[9,10,11],[13,14,15]]
>>> _sum = _list + _nested_list
>>> r = sorted(_sum, key=lambda e: e if type(e) == int else e[0])
>>> r
[0, 1, [2, 3, 4], 5, [6, 7, 8], [9, 10, 11], 12, [13, 14, 15], 16]
'분석 Python > 구현 및 자료' 카테고리의 다른 글
Python) 특정 코드의 패턴 조합 찾기 (0) | 2022.08.28 |
---|---|
[Python] 이산화된 공간 안에 속하는 좌표 찾기 (0) | 2022.05.19 |
Python) 직선 기준 점 대칭 이동 구현 (0) | 2022.04.29 |
Python) 고객 생애 가치(CLV) 예측하기 (0) | 2022.03.17 |
Python) 고객 생애 가치(CLV)에 대해서 알아보기 (0) | 2022.03.17 |