알고리즘 문제를 풀다 보면 리스트를 이리 저리 자르고 붙이다가 마지막에 하나의 문자열로 출력해야 할 때가 있습니다. 언제나와 같이 예를 들어보겠습니다.
word='Python'
li=list(word) # string(문자열)을 리스트로 만들기
>>> ['P', 'y', 't', 'h', 'o', 'n']
list 함수에 문자열을 넣을 경우 통째로가 아니라 한 자 한 자를 떼어 리스트 값으로 만듭니다. 이 문자열을 다시 합쳐서 'Python'으로 만들고 싶을 땐 어떻게 하면 될까요?
첫 번째로 for문을 써볼 수 있습니다.
word='Python'
li=list(word)
li_to_word=''
for w in li: # 리스트 안의 w를
li_to_word+=w # 하나씩 더해준다
print(li_to_word)
>>> Python
파이썬에서 문자열 사이에 덧셈이 가능하기 때문에 쓸 수 있는 방법입니다. 하지만 리스트가 1,000개 이상의 값을 가지고 있다면 시간이 너무 많이 들겠죠. 그렇기 때문에 이런 상황에서는 보통 join을 사용합니다.
li_to_word=''.join(word)
print(li_to_word)
print(type(li_to_word))
>>> Python
>>> <class 'str'>
보다시피 쉽게 리스트를 문자열로 변환시킬 수 있습니다. 좀 더 join을 살펴볼까요?
li_to_word='.'.join(word)
print(li_to_word)
li_to_word='&'.join(word)
print(li_to_word)
>>> P.y.t.h.o.n
>>> P&y&t&h&o&n
join의 앞에 들어가는 작은 따옴표(큰 따옴표도 될 수 있겠죠?) 사이에 무엇이 들어가느냐에 따라 리스트를 하나의 문자열로 합칠 때 나오는 값도 달라집니다. 처음에는 아무것도 넣지 않았기 때문에 문자열이 그대로 반환되었지만, 온점과 '&'을 넣었을 때는 리스트 값들 사이에 해당 부호들이 들어간 것을 볼 수 있습니다.
그럼 위에서 썼던 for문으로 문자열들을 결합하는 방법과 join을 썼을 때, 두 가지 경우가 얼마나 차이나는지 비교해보겠습니다. 시간을 측정하기 위해 time 라이브러리의 time 함수를 사용했습니다.
li=[i for i in range(100000)] # 숫자 10만 개로 채워진 리스트
li=list(map(str, li)) # int를 str으로 변환
for문을 썼을 때는 다음과 같습니다.
start_time=time.time() # 연산 시작 시간
li_to_word=''
for w in li:
li_to_word+=w
end_time=time.time() # 연산 종료 시간
# print(li_to_word)
print(end_time-start_time) # 연산에 걸린 총 시간
>>> 0.031000852584838867
join을 썼을 때는 다음과 같습니다.
start_time=time.time()
li_to_word = ''.join(li)
end_time=time.time()
print(end_time-start_time)
>>> 0.002002239227294922
속도 차이를 알아보기 쉽도록 일부러 길이가 10만인 리스트를 사용했는데, 정말 차이가 많이 나는군요.
리스트를 문자열로 결합해야 할 경우에는 편하게 join을 사용하면 될 것 같습니다!
'Python > Data Structure' 카테고리의 다른 글
[Python] 리스트 안의 이스케이프 문자 일괄 소거하기 (0) | 2021.08.20 |
---|---|
[Python]리스트 값들 카운트하고 가장 빈도수 높은 값 찾기 (0) | 2021.08.19 |
[Python] 리스트 두 개로 dict 만들기 (0) | 2021.03.04 |
[Python] 리스트 안에서 순열(permutation)과 조합(combination) 활용하기 (0) | 2021.02.25 |
[Python]리스트 절대값순으로 정렬하기 (0) | 2021.02.11 |