문자열을 구분자 자리마다 잘라 리스트로 만들 때는 **문자열.split(구분자)**를 쓰고, 문자열 리스트를 구분자로 이어 붙여 문자열 하나로 합칠 때는 **구분자.join(리스트)**를 씁니다.
문자열 메서드에서는 strip()이나 replace()로 문자열 하나를 다듬었습니다. 그러나 파일이나 입력에서 읽은 한 줄에는 '사과,배,감'이나 '민지 90 85'처럼 여러 값이 한 문자열에 묶여 들어옵니다. 이 값들을 하나씩 꺼내 다루려면 문자열을 리스트로 쪼개야 하고, 반대로 리스트에 모은 단어들을 파일이나 화면에 한 줄로 내보내려면 다시 문자열 하나로 합쳐야 합니다.
이 단원(파일과 모듈)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.
1문자열을 리스트로 쪼개기 — split
문자열.split(구분자)는 구분자 문자열이 나오는 자리마다 원래 문자열을 잘라 새 리스트로 돌려줍니다. 구분자 자체는 결과에 들어가지 않습니다.
s = '사과,배,감'
words = s.split(',')
print(words)
print(s)
['사과', '배', '감']
사과,배,감s.split(',')가 새 리스트 ['사과', '배', '감']을 만들어 돌려주었을 뿐, 원래 문자열 s는 그대로 '사과,배,감'입니다(규칙 3).
괄호 안에 아무것도 넣지 않고 s.split()을 부르면, 빈칸이 여러 개 연달아 있거나 줄바꿈(\n)이 섞여 있어도 연속된 공백을 하나로 묶어 깔끔하게 잘라 줍니다. 아래 코드의 실행 결과를 먼저 맞혀 보세요.
line = ' 서울 부산\n대구 '
print(line.split())
실행 결과 보기
['서울', '부산', '대구']예상과 다르면 그곳이 배울 곳입니다. 인자 없는 split()은 앞뒤 공백을 먼저 떼어 내고, 단어 사이의 여러 칸 공백과 줄바꿈을 모두 구분자로 삼아 단어만 담긴 리스트를 돌려줍니다.
2문자열 리스트를 하나로 합치기 — join
join은 split의 반대입니다. 다만 부르는 방향을 주의해야 합니다. 리스트가 아니라 사이에 끼워 넣을 구분자 문자열에서 .join(리스트)를 부릅니다.
words = ['사과', '배', '감']
a = ' / '.join(words)
b = '-'.join(words)
c = ''.join(words)
print(a)
print(b)
print(c)
사과 / 배 / 감
사과-배-감
사과배감' / '.join(words): 칸 사이 두 자리에만' / '를 끼워'사과 / 배 / 감'을 만듭니다. 양끝에는 붙지 않습니다.''.join(words): 빈 문자열''로 이어 붙이면 사이사이에 아무것도 끼우지 않고'사과배감'으로 딱 붙입니다.
| 하려는 일 | 쓰는 모양 | 돌려주는 값의 종류 |
|---|---|---|
| 문자열 → 리스트 | '사과,배'.split(',') | 리스트 (['사과', '배']) |
| 리스트 → 문자열 | ', '.join(['사과', '배']) | 문자열 ('사과, 배') |
예제
쉼표로 적힌 점수들의 합 구하기
한 줄에 '80,90,100'처럼 적힌 문자열에서 합을 구하려면, 먼저 split(',')으로 쪼갠 뒤 조각마다 int()로 바꾸어 더합니다.
raw = '80,90,100'
parts = raw.split(',')
total = 0
for p in parts:
total = total + int(p)
print('합:', total)
합: 270split(',')이 돌려준 ['80', '90', '100']의 각 칸은 아직 문자열이므로 int(p)로 바꾸어 더했습니다.
날짜 조각을 하이픈으로 잇기
리스트에 담긴 연·월·일 문자열을 '-'와 '/'로 각각 이어 붙이면 무엇이 찍힐지 먼저 맞혀 보세요.
day = ['2026', '10', '20']
print('-'.join(day))
print('/'.join(day))
실행 결과 보기
2026-10-20
2026/10/20예상과 다르면 그곳이 배울 곳입니다. 같은 리스트 day라도 앞에 어떤 구분자 문자열을 두고 .join(day)를 부르느냐에 따라 이어지는 모양이 달라집니다.
자주 틀리는 곳
1. 리스트에서 .join()을 부른다
틀린 생각: 리스트를 합치는 것이니 words.join(', ')처럼 리스트 뒤에 .join()을 붙인다.
왜 이렇게 생각하기 쉬운가 하면, append()나 sort()처럼 리스트를 다루는 메서드는 늘 리스트에서 불렀기 때문입니다. 그러나 join()은 리스트가 아니라 구분자 문자열의 메서드입니다.
words = ['사과', '배']
print(words.join(', '))
Traceback (most recent call last): File "main.py", line 2, in <module> print(words.join(', ')) ^^^^^^^^^^AttributeError: 'list' object has no attribute 'join'리스트에는 join이라는 메서드가 없어 AttributeError로 멈춥니다.
맞는 규칙: 늘 구분자문자열.join(리스트) 순서로 씁니다(', '.join(words)).
2. 정수 리스트를 그대로 join에 넘긴다
틀린 생각: nums = [1, 2, 3]에 ', '.join(nums)를 쓰면 '1, 2, 3'이 된다.
왜 이렇게 생각하기 쉬운가 하면, print(1, 2, 3)은 정수도 알아서 글자로 찍어 주기 때문입니다. 그러나 join()은 오직 문자열만 담긴 리스트만 이어 붙일 수 있으며, 정수가 섞여 있으면 TypeError가 납니다.
nums = [1, 2, 3]
print(', '.join(nums))
Traceback (most recent call last): File "main.py", line 2, in <module> print(', '.join(nums)) ~~~~~~~~~^^^^^^TypeError: sequence item 0: expected str instance, int found0번 칸에서 문자열(str)을 기대했는데 정수(int)가 나왔다는 뜻입니다. 정수를 이어 붙이려면 먼저 문자열로 바꾸어야 합니다.
nums = [1, 2, 3]
strs = [str(n) for n in nums]
print(', '.join(strs))
1, 2, 3맞는 규칙: join()에 넘기는 리스트의 모든 칸은 문자열이어야 합니다. 정수는 str(n)으로 바꾼 뒤 넘깁니다.
3. s.split()만 부르면 원래 문자열이 바뀐다고 생각한다
틀린 생각: s.split(',')을 실행하면 s 자체가 리스트로 바뀐다.
왜 이렇게 생각하기 쉬운가 하면, 리스트의 sort()처럼 제자리에서 바뀌는 메서드를 떠올리기 때문입니다. 그러나 문자열 메서드는 원래 문자열을 절대 바꾸지 않고 새 값을 만들어 돌려줍니다(규칙 3).
s = '가,나,다'
s.split(',')
print(s)
가,나,다2번 줄이 만든 리스트에 이름을 붙이지 않아 버려졌고, s는 그대로 문자열 '가,나,다'입니다.
맞는 규칙: 쪼갠 결과를 쓰려면 parts = s.split(',')처럼 돌려받은 새 리스트에 이름을 붙여야 합니다(규칙 3).
확인 문제
1. 다음 코드를 실행하면 무엇이 출력될까요?
text = '봄:여름:가을'
seasons = text.split(':')
print(seasons[1])
print(' -> '.join(seasons))
힌트
text.split(':')이 만드는 리스트 ['봄', '여름', '가을']에서 1번 칸이 무엇인지, 그리고 그 사이사이에 ' -> '를 끼우면 어떻게 되는지 보세요.
정답
여름
봄 -> 여름 -> 가을seasons는 ['봄', '여름', '가을']이 되어 1번 칸인 '여름'이 먼저 찍히고, 다음 줄에서 ' -> '로 이어 붙인 '봄 -> 여름 -> 가을'이 찍힙니다.
2. 리스트 items = ['우유', '식빵', '달걀']을 ' + '로 이어 붙여 '우유 + 식빵 + 달걀'을 출력하도록 빈칸을 채우세요.
items = ['우유', '식빵', '달걀']
line = ________________
print(line)
힌트
구분자 문자열 ' + '를 앞에 두고 .join(...)에 리스트 items를 넘깁니다.
정답
' + '.join(items)를 넣으면 됩니다. items.join(' + ')처럼 반대로 쓰면 AttributeError가 납니다.
3. 다음 코드는 전화번호 조각 ['010', '1234', '5678']을 하이픈('-')으로 이어 붙이려 한 것인데 오류가 납니다. 잘못된 줄을 바르게 고쳐 보세요.
p = ['010', '1234', '5678']
phone = p.join('-')
print(phone)
힌트
join은 리스트가 아니라 구분자 문자열 '-'에서 불러야 합니다.
정답
2번 줄을 phone = '-'.join(p)로 고치면 '010-1234-5678'이 출력됩니다.
p = ['010', '1234', '5678']
phone = '-'.join(p)
print(phone)아래 코드에서 raw를 공백 기준으로 쪼갠 뒤 ' / '로 이어 붙여 '국어 / 영어 / 수학'이 출력되게 바꿔 보세요.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.