관리 메뉴

솜씨좋은장씨

[Python] List Comprehension과 리스트를 다루는 여러가지 방법들! 본문

Programming/Python

[Python] List Comprehension과 리스트를 다루는 여러가지 방법들!

솜씨좋은장씨 2020. 4. 2. 13:19
728x90
반응형

추후 블로그를 참고하면서 사용하면 편리할 것 같은 것들을 정리해보았습니다.

 

먼저 여러개의 숫자를 포함한 리스트를 하나 정의합니다.

num_list = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]

이 리스트를 활용하여 몇가지 방법에 대해 적어보려합니다.

 

1. N보다 큰 숫자만 남기기

만약 N이 3이라고 할때 List Comprehension을 사용하지 않았을경우

new_list = []

for num in num_list:
    if num > 3:
        new_list.append(num)

평소에는 위와 같이 작성하게 됩니다.

 

여기서 List Comprehension을 사용하면 더 짧고 간결하게 코드를 작성할 수 있습니다.

new_list = [ num for num in num_list if num > 3 ]

이외에도 filter를 활용하는 방법도 있습니다.

new_list = list(filter(lambda x: x > 3, num_list))

 

2. 리스트 내 각 요소에 N씩 더한 리스트 만들기

만약 N이 3이라고 할때 List Comprehension을 사용하지 않았을 경우

for i in range(len(num_list)):
    num_list[i] += 3

 

List Comprehension을 사용한 경우

num_list = [ num + 3 for num in num_list ]

lambda를 활용한 경우

num_list = list(map(lambda num: num+3, num_list))

 

3. 같은 값으로 채워진 길이가 N인 리스트 만들기

만약 N이 4이고, 각각의 인자가 None값을 가지는 [None, None, None, None] 리스트를 만드는 경우

four_nones = [None] * 4

다음의 경우 처럼 실행하게되면 모든 성분이 동일하게 불변의 값으로 채워진 리스트를 만들 수 있습니다.

 

하지만 이 방법을 활용하여 각각의 인자가 None값이 아닌 비어있는 리스트( [ ] ) 를 인자로 가지려고하는 경우

four_empty_lists = [[]] * 4

위의 방법처럼 * 연산자를 활용하여 리스트를 만들게 되면 한가지 문제가 생기게 됩니다.

 

만약 이렇게 만든 리스트의 인자중에 가장 앞에있는 비어있는 리스트 인자에만 'TEST' 라는 값을 넣고자 할 때

four_empty_lists[0].append("TEST")

다음의 코드를 활용하여 "TEST"를 추가하고 출력해보면

우리가 생각했던대로 맨 앞의 비어있는 리스트 인자에만 값이 추가되는 것이 아니라

모든 인자에 "TEST" 가 출력되는 것을 확인할 수 있습니다.

print(four_empty_lists)
[ ["TEST"], ["TEST"], ["TEST"], ["TEST"] ]

이는 리스트가 변경 가능한 객체이기 때문이며

* 연산자를 활용하여 이러한 리스트를 만들면 모두 같은 리스트를 가리키는 N개의 참조가 생기기 때문입니다.

 

따라서 이를 원치 않는다면

List Comprehension을 활용하여 해결할 수 있습니다.

four_empty_lists = [ [] for __ in range(4) ]

이 방식을 사용하게되면

 

이전과 동일하게 맨 앞에 비어있는 리스트 인자에만 "TEST"를 추가하고자 하여 다음의 코드를 실행해보면

four_empty_lists[0].append("TEST")
print(four_empty_lists)

다음과 같이 원하는대로 맨 앞의 비어있는 리스트 인자에만 "TEST"값이 잘 추가되어있는 것을 확인할 수 있습니다.

[ ["TEST"], [], [], [] ]

 

4. 이차원 배열을 1차원 배열로 만드는 방법

2D_list = [[1, 2], [3, 4]]

위와 같이 2차원 배열이 하나 존재할때 이 배열을

1D_list = [1, 2, 3, 4]

위와 같이 바꾸는 방법은 다음과 같습니다.

1D_list = list(itertools.chain.from_iterable(2D_list))
Comments