Python/2.7 information

flatten list of lists

qkqhxla1 2018. 10. 16. 15:14

https://stackoverflow.com/questions/11264684/flatten-list-of-lists/11264799


참고. 


리스트안에 리스트가 있을 경우 flatten시키고 싶은 경우가 있다.


[[1], [2,3], [4,5,6], [7,8,9,10]] -> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


예전에 numpy를 한번 봤었을때 https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.flatten.html 같이 특정 함수가 있을줄 알았는데, 


list comprehension을 사용해서 flatten이 가능하다. 파이썬에는 flatten에 관련된 표준 함수가 없다고 하는


그 이유는 여기에 나와있다.

https://softwareengineering.stackexchange.com/questions/254279/why-doesnt-python-have-a-flatten-function-for-lists


list comprehension을 이용하는 방법은 아래와 같다.


list_of_lists = [[1], [2,3], [4,5,6], [7,8,9,10]]
flattened = [val for sublist in list_of_lists for val in sublist]

print flattened 


여기서 list comprehension을 좀 신기하게 한다.(나만 신기한가) 일반적으로 list comprehension을 만들때 


오른쪽에서 왼쪽으로 만들었는데, 여긴 일단 list_of_lists를 반복하게 한 후 그 각각의 인자를 다시 이 


list_of_list의 바깥에 씌운다(?) 그러니까 펼쳐서 짜보자면

def flatten_list(list_of_lists, depth):
    if depth > 0:
        return list_of_lists
    
    ret_list = []
    for sublist in list_of_lists:
        if type(sublist) is list:
            ret_list.extend(flatten_list(sublist, depth + 1))
        else:
            ret_list.append(sublist)
    return ret_list

list_of_lists = [[1], [2,3], [4,5,6], [7,8,9,10]]
print flatten_list(list_of_lists, 0)
flattened = [val for sublist in list_of_lists for val in sublist]
print flattened

이런식으로 될것같다. 리스트안에 리스트 하나일경우에는 되지만 2개이상일 경우.


[[1], [2,3], [4,[5],6], [7,8,9,10]] 요런 경우는 되지 않는다.


결론은 이런 종류의 희안한 comprehension도 되는구나...