리스트 안에 리스트를 다 풀어주고 싶습니다
조회수 10152회
발생하는 문제 및 실행환경
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 답변
-
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)
라고 직접 정의해주세요.
댓글 입력