#연구/#Python

[파이썬/Python] 두 개 이상의 리스트 병합하기 #리스트 각 요소별 병합 #merge list #리스트 각 요소의 위치별로 병합하기

every7hing 2020. 12. 9. 14:26
반응형

 

[파이썬/Python] 두 개 이상의 리스트 병합하기 

#리스트 각 요소별 병합 

#merge list 

#리스트 각 요소의 위치별로 병합하기

 

두 개 이상의 리스트를 병합하고 싶을 경우, 어떻게 해야할까?

단순 병합이 아닌, 리스트 내 각 요소의 위치별로 묶고 싶다면?

 

예를 들어

[1,2,3], [3,4,5]의 두 리스트가 있을 경우,

병합 결과 아래와 같이 나오게 하고 싶다.

[1,3], [2,4] ,[3,5]

 

그리고, 두 개 이상의 리스트가 요소의 길이가 다를 경우에도 병합하길 원한다면..

 

먼저 위 조건을 만족시키는 함수를 구현한다.

def merge_list(*args, fill_value = None):
  max_length = max([len(lst) for lst in args])
  merged = []
  for i in range(max_length):
    merged.append([
      args[k][i] if i < len(args[k]) else fill_value for k in range(len(args))
    ])
  return merged

 

fill_value는 만약 두 개 이상의 리스트가 길이가 다를 경우, 병합했을 때 짝이 안맞을 수 있는데

리스트의 길이가 짧은 쪽에는 file_value를 넣어줘서 채워주고 싶은 값을 설정할 수 있도록 했다.

 

테스트를 위해 아래와 같은 3가지 종류의 리스트가 있다고 가정한다.

A = ['a', 'b', 'c']
B = [3, 4, 5, 6]
C = [True, False]

 

위 3가지 리스트를 구현한 함수로 병합하면 어떤 결과가 나올까?

먼저 fill_value는 넣지 않고 단순 병합을 시도한다.

print(merge_list(A, B, C))

 

그 결과, 아래와 같이 각 요소의 위치별로 잘 병합이 되고, 길이가 짧은 쪽의 리스트 값들은 'None'이 들어가는 것을 볼 수 있다.

[['a', 3, True], ['b', 4, False], ['c', 5, None], [None, 6, None]]

 

그러면 None 말고 다른 값으로 채워넣고 싶다면, fill_value를 설정하면된다.

'_BLANK_'라는 문구를 넣어보았다.

print(merge_list(A, B, C, fill_value = '_BLANK_'))

 

그 결과, None 자리에 '_BLANK_' 문구가 나타나는 것을 볼 수 있다.

[['a', 3, True], ['b', 4, False], ['c', 5, '_BLANK_'], ['_BLANK_', 6, '_BLANK_']]

 

자주는 아니어도, 언젠간 쓸 날이 올 것이기에 기억해두면 좋을 것 같다.

아래에는 전체 코드를 공유한다.

def merge_list(*args, fill_value = None):
  max_length = max([len(lst) for lst in args])
  merged = []
  for i in range(max_length):
    merged.append([
      args[k][i] if i < len(args[k]) else fill_value for k in range(len(args))
    ])
  return merged
  
A = ['a', 'b', 'c']
B = [3, 4, 5, 6]
C = [True, False]


print(merge_list(A, B, C))
print(merge_list(A, B, C, fill_value = '_BLANK_'))

 

반응형