리스트 안에 리스트를 다 풀어주고 싶습니다

조회수 10138회

발생하는 문제 및 실행환경

L = [[[1, 2, 3], [4, 5]], 6] 이렇게 리스트의 원소가 리스트인 경우

[1, 2, 3, 4, 5, 6] 같이 리스트 원소를 다 풀어주려고 합니다.

제가 아는 방법은 리스트가 [[1,2], [3,4], 5]같이 2중일 때는 쓸 수 있는데 [[[1, 2, 3], [4, 5]], 6]같이 3중일 때는 쓸 수 없습니다.

다른 방법 없을까요?

소스코드

L = [[[1, 2, 3], [4, 5]], 6]
L = [item for sublist in L for item in sublist]
print L

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    2중 리스트인 경우는 리스트를 편평하게 해주는 함수 flatten()를 정의할 때, 리스트의 원소가 iterable인 경우(스트링은 제외) extend 하는 방식을 씁니다.

    이를 확장해서 다중 리스트는 flatten() 함수 내에서 재귀 함수를 쓰는 방식으로 구현할 수 있습니다.

    소스코드

    def flatten(x):
        result = []
        for el in x:
            if hasattr(el, "__iter__") and not isinstance(el, basestring): 
                #스트링형이 아닌 이터러블의 경우 - 재귀한 후, extend
                result.extend(flatten(el)) #재귀 호출
            else:
                #이터러블이 아니거나 스트링인 경우 - 그냥 append
                result.append(el)
        return result
    
    flatten(L)
    

    여기서 속도를 빠르게 하려면 generator를 씁니다.

    def flatten(l):
        for el in l:
            if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
                for sub in flatten(el):
                    yield sub
            else:
                yield el
    

    단, python3에서는 basestring이 없으므로 맨 앞에 basestring = (str,byte)라고 직접 정의해주세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)