본문으로 건너뛰기

글과 리스트 사이: split·join

파이썬 목차파일과 모듈레슨 48 / 59

목차

문자열을 구분자 자리마다 잘라 리스트로 만들 때는 **문자열.split(구분자)**를 쓰고, 문자열 리스트를 구분자로 이어 붙여 문자열 하나로 합칠 때는 **구분자.join(리스트)**를 씁니다.

문자열 메서드에서는 strip()이나 replace()로 문자열 하나를 다듬었습니다. 그러나 파일이나 입력에서 읽은 한 줄에는 '사과,배,감'이나 '민지 90 85'처럼 여러 값이 한 문자열에 묶여 들어옵니다. 이 값들을 하나씩 꺼내 다루려면 문자열을 리스트로 쪼개야 하고, 반대로 리스트에 모은 단어들을 파일이나 화면에 한 줄로 내보내려면 다시 문자열 하나로 합쳐야 합니다.

이 단원(파일과 모듈)을 이미 안다면 단원 연습 문제부터 풀고 틀린 레슨만 보세요.

7단계 중 1단계. 문자열 '사과,배,감'을 쉼표 자리에서 쪼개 리스트로 만들고, 다시 ' / '를 사이에 끼워 문자열 하나로 합칩니다.

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)
실행 결과
합: 270

split(',')이 돌려준 ['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 found

0번 칸에서 문자열(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를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로