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


발생하는 문제 및 실행환경

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
  • 2016년 01월 27일에 작성됨

조회수 315


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)라고 직접 정의해주세요.

  • 2016년 01월 27일에 작성됨

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close