본문 바로가기

[내일배움캠프]스파르타코딩클럽 AI 웹개발/Today I Learned

[내일배움캠프 10일차 TIL] 이중리스트 풀기 with python

 

Today's Trigger

 

 


이중리스트는 리스트 안에 리스트가 있는 형태를 말한다

예를들어

l = [["a","b"],["c","d"]]

이런 형태의 리스트를 이중리스트라고 하는데

위 리스트를 어떻게 아래의 리스트처럼 만들 것인가에 대한 내용을 다루고자 한다

l = ["a","b","c","d"]

 

 

1. sum() 이용하기

파이썬에서 제공하는 sum()함수를 살펴보면

 

사실 봐도 잘 모른다

설명을 덧붙여 보자면 sum은 2개의 인자를 받을 수 있는데 아무것도 입력하지 않으면 0이 되는 것이다

그래서 보통 sum() 함수를 사용할 때 괄호 안에 하나의 정수로 된 리스트를 입력하면 정수 리스트의 합을 반환해 주는 것이다

그러면 다른 값을 입력한다면?

 

일단 sum함수에 하나의 정수 리스트만 넣는다면

a =[1,2]
print(sum(a))

 

너무나 당연하게도 3을 반환해준다

그리고 sum함수에 정수값을 하나 더 넣어주어서

print(sum(a, 10))

 

이렇게 실행하게 되면 13이라는 값을 얻을 수 있게 된다

이것은 sum 함수에서 start = 10이라는 값으로 설정해준 것이 된다

즉 10+1+2를 계산하여 13을 리턴해 주는 것이다

물론 아무것도 입력하지 않은 위의 경우는 0+1+2 를 계산해 리턴해 준 것이겠지!

 

그럼 둘 다 리스트를 넣으면 어떻게 되느냐?

a = [1,2]
b = [3,4]

print(sum(a, b))

 

이걸 실행하면

TypeError: can only concatenate list (not "int") to list 

이 오류가 발생한다. 대충 알아보면 리스트는 리스트끼리 합칠 수 있다! 정수가 아니라!

이런 뜻인데 이 sum 함수가 왜 이런 말을 하나면

sum(a,b) = [3,4]+1+2 라고 생각하기 때문이다! 그래서 리스트는 리스트끼리만 합칠 수 있어라고 말하는 것!

 

이걸 이용해서 이중리스트를 풀어보자

l = [["a","b"],["c","d"]]
print(sum(l,[]))

 

이렇게 작성하면 python의 sum함수는 []+["a","b"]+["c","d"]를 계산하게 되어

우리에게 ["a","b","c","d"]를 리턴해 주게 되는 것이다

 

 

 

2. itertools.chain() 사용하기

itertools는 파이썬에서 제공하는 라이브러리로 itertools가 있는데 itertools.chain()을 사용하면 쉽게 이중 리스트를 풀 수 있다

import itertools

l = [["a","b"],["c","d"]]

print(list(itertools.chain(l)))

 

이중리스트를 풀겠다고 냅다 이렇게 실행하면

원하던 값은 안나오고

[["a","b"],["c","d"]] 이렇게 나온다

그래서 우리가 원하는 값을 얻기 위해서는

print(list(itertools.chain(*l)))

 

이처럼 앞에 *을 붙여주어야 한다

그러면 원래 얻고자 했던 ["a","b","c","d"]를 출력하게 된다

 

 

3. 반복문으로 풀기

사실 가장 쉽게 생각할 수 있는 방법이 반복문을 돌려서 푸는 것이다

 

n = []
for i in l:
    for j in i:
        n.append(j)

print(n)

 

이걸 리스트 컴프리헨션을 사용해서 한 줄로 작성하면

print([j for i in l for j in i])

 

이렇게 되는 것이다

 


그럼 이 세 개 중 무엇을 사용하는 것이 가장 좋은가?

각각을 출력해보면

 

litertools.chain을 사용한 것이 가장 빠르다는 것을 알 수 있다!

물론 데이터 많지 않아 실제로 체감하기는 힘들겠지만,,,

그저 상황에 맞게 쓰면 될 것 같다

 

 


 

 

오늘자 코드카타를 풀면서 sum의 새로운 사용법에 대해 알게 되었다

코드카타를 하면서 원래 쓰던 방식과 다르게 사용될 수 있다는걸 알아서 꽤나 흥미로웠다

역시 알고있던거라도 놓치는 부분이 있을 수 있으니 잘 찾아보는게 중요하단걸 다시 알게 되었달까...

 

 

물론 지금 풀고있는 코드카타가 어려운 문제가 아니라 제대로 알고리즘을 경험하는 것은 아니지만

그래도 열심히 코드카타 하면서,,, 알고리즘에 대한 공부를 조금씩 해야 할 것 같다!

 

 

사실 안 기뻐 내일 알바가야해...