Python) list와 nested list안에 값을 기준으로 병합하는 코드

2022. 5. 6. 21:30분석 Python/구현 및 자료

728x90

 

이름을 어떻게 해야 할지 모르겠지만, 일단 시작하면 다음과 같은 문제가 있었다.

 

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]

 

728x90