Python

파트6. 2차원 리스트를 1차원 리스트로 만들기

누구용 2022. 7. 14. 16:13

문자열을 담은 이차원 리스트, mylist 가 solution 함수의 파라미터로 주어집니다. solution 함수가 mylist를 일차원 리스트로 만들어 리턴하도록 코드를 작성해주세요.제한 조건

  • arr의 길이는 1 이상 100 이하인 자연수입니다.
  • arr 원소의 길이는 5를 넘지 않습니다.

예시

inputoutput

[[1], [2]] [1, 2]
[['A', 'B'], ['X', 'Y'], ['1']] ['A', 'B', 'X' ,'Y', '1']

 

제출한 정답

def solution(mylist):
    answer = [y for x in mylist for y in x ]
    return answer

예측 오답

def solution(mylist):
    answer = []
    for element in my_list:
        answer += element
    return answer

풀이 정답

def solution(mylist):
    import itertools
    answer = list(itertools.chain(*mylist))
    return answer

# 방법 1 - sum 함수
answer = sum(mylist, [])

# 방법 2 - itertools.chain
import itertools
answer = list(itertools.chain.from_iterable(mylist))

# 방법 3 - itertools와 unpacking
import itertools
answer = list(itertools.chain(*mylist))

# 방법 4 - list comprehension 이용
answer = [element for array in mylist for element in array]

# 방법 5 - reduce 함수 이용 1
from functools import reduce
answer = list(reduce(lambda x, y: x+y, mylist))

# 방법 6 - reduce 함수 이용 2
from functools import reduce
import operator
answer = list(reduce(operator.add, mylist))

# 방법 7 - numpy 라이브러리의 flatten 이용
import numpy as np
answer = np.array(mylist).flatten().tolist()

 

방법 1.

기본적으로 sum 함수의 경우 아래의 방법이 적용된다.

 

sum(iterable, start=0)

sum 함수는 iterable 하고 숫자로만 이루어진 변수와 추가적으로 더해줄 숫자를 입력받는다.

반환 : iterable의 합 + start 값 

 

python 에서 + 연산은 리스트의 연결로 이루어지기 때문에 sum(mylist, [])을 사용해도 list 가 이어진다. 

주요한 것은 start 부분에 []를 입력해 주어야 [] + [1] + [2] 로 [1, 2]가 된다.
default 가 0으로 0 + [1] + [2] 의 경우 type error가 발생한다.

 

방법2, 방법 3

itertools의 chain을 사용하였다.

iterable 가능한 변수를 입력하면 하나의 리스트로 반환한다.

from_iterable의 경우 하나의 iterable 변수를 입력해야 한다.

 

list(itertools.chain('abcdef')) -> ['a', 'b', 'c', 'd', 'e', 'f']

list(itertools.chain(['a'], ['b', 'c', ,'d', 'e', 'f'])) -> ['a', 'b', 'c', 'd', 'e', 'f']

list(itertools.chain.from_iterable('abcdef')) -> ['a', 'b', 'c', 'd', 'e', 'f']

 

방법 4.

list comprehension을 사용하여 내부에서 2중 for문을 하나의 list로 반환한다.

헷갈릴 수 있는 점은 for문의 위치인데 

[element for array in mylist for element in array]

 

for array in mylist:

    for element in array:

    element

순서대로 사용하면 된다.

 

방법 5, 방법 6

functools의 reduce를 사용하였다.

lambda와 operator.add를 사용한 점만이 방법 5, 6에서의 차이이다.

reduce 함수는 함수와 iterable 변수를 입력받는다.

 

map과 비슷하게 반복되며 function을 수행한다.

reduce의  function 에는 2개의 인자 데이터가 들어가게 되는데

[['A', 'B'], ['X', 'Y'], ['1']] 를 예로 들면

처음 반복될때 x = ['A', 'B'], y = ['X', 'Y']가 들어가고

반환값이 x에 저장되고 다음 반복 수행시 x에 들어가게 된다.

x = ['A', 'B', 'X', 'Y'], y = ['1']로 + 수행후 결과 x를 반환하게 된다.

 

방법 7

numpy 를 사용할 경우

numpy array로 변환한 후에 한 차원 낮은 리스트로 반환해주는 flatten을 사용, list로 변환할 수 있다.

해당 방법은 [[1], [2]] 에만 적용되고 [['A', 'B'], ['X', 'Y'], ['1']] 에는 적용되지 않는다.

column의 길이가 다르기 떄문에 flatten이 적용되지 않기 때문이다.