HOWTO · Python

Python에서 문자열을 리스트로 변환하는 방법

Python에서 list(), split(), ast.literal_eval(), 리스트 컴프리헨션 중 무엇을 써야 하는지 알아보고 문자열을 문자, 단어, 구분된 값 또는 검증된 리스트 데이터로 변환하는 방법을 살펴봅니다.

이 페이지의 내용

결과 리스트에서 항목 하나가 무엇을 나타내야 하는지에 따라 방법을 고르세요. 문자마다 항목 하나를 만들려면 list(text), 단어나 구분자로 나뉜 값을 얻으려면 text.split(), 이미 Python 리터럴을 나타내는 신뢰할 수 있는 텍스트를 읽으려면 ast.literal_eval(text)을 사용합니다. 항목을 필터링하거나 변환할 때는 리스트 컴프리헨션을 쓸 수 있습니다. 완전히 제어할 수 없는 입력에 eval()을 사용하지 마세요. 임의의 Python 코드를 실행할 수 있습니다.

list()로 문자열을 문자 목록으로 변환하기

list()는 문자열을 순회해 유니코드 코드 포인트마다 요소 하나를 만듭니다. 문장을 단어 단위로 나누지는 않습니다. 예를 들어 결합 악센트는 글자에 시각적으로 붙어 보이더라도 별도의 코드 포인트일 수 있습니다.

text = "Hello"
characters = list(text)
print(characters)

이 방법은 문자 단위로 처리할 때 유용합니다. 공백과 문장 부호도 각각 문자로 포함되므로, 작업에 필요하지 않다면 직접 제거하거나 변환해야 합니다.

split()으로 단어 또는 구분된 값 나누기

인수 없이 split()을 호출하면 연속된 공백을 기준으로 단어를 나눕니다. 앞뒤 공백은 무시되며, 여러 개의 공백이나 탭, 줄바꿈은 하나의 구분자처럼 처리됩니다.

sentence = "Convert this string to a list"
words = sentence.split()
print(words)

입력에 정해진 구분자가 있다면 그 문자를 명시적으로 전달하세요. 쉼표로 나눈 필드 앞뒤의 공백을 허용하려면 분할한 뒤 각 필드의 공백을 제거합니다.

text = "red, green, blue"
colors = [item.strip() for item in text.split(",")]
print(colors)

명시적 구분자를 사용하면 빈 필드도 보존됩니다. "red,,blue".split(",")의 결과에는 두 쉼표 사이의 빈 문자열이 포함됩니다. 구분자가 문자열에 없으면 원래 문자열 전체가 하나의 항목이 됩니다. 분할 횟수를 제한하려면 maxsplit을 사용하세요. "red,green,blue".split(",", maxsplit=1)은 두 번째 항목에 green,blue를 함께 둡니다.

split()은 CSV 파서가 아닙니다. "red, bright",blue처럼 필드 안에 따옴표로 묶인 구분자가 있을 수 있다면 인용 규칙을 올바르게 처리하는 Python의 csv 모듈을 사용하세요.

목록을 나타내는 텍스트 파싱하기

텍스트가 "[1, 2, 3]"처럼 이미 Python 리터럴 문법을 따른다면 ast.literal_eval()로 파싱할 수 있습니다. 이 함수는 임의의 식을 실행하지 않고 리터럴 값과 컨테이너를 읽습니다. 그래도 텍스트의 문법은 올바라야 합니다. 형식이 잘못되면 ValueError 또는 SyntaxError가 발생할 수 있습니다.

import ast

text = "[1, 2, 3]"
values = ast.literal_eval(text)
if isinstance(values, list):
    print(values)
else:
    print("The parsed value is not a list")

파싱에 성공해도 결과가 반드시 리스트인 것은 아닙니다. 예를 들어 "(1, 2)"는 튜플을 나타냅니다. 리스트로 사용하기 전에 파싱된 값의 타입을 확인하고, 입력 형식이 달라질 수 있다면 파싱 오류도 처리하세요. JSON 텍스트에는 json.loads()를 사용하세요. JSON 문법과 Python 리터럴 문법은 비슷하지만 같지는 않습니다. 입력을 완전히 제어할 수 없다면 ast.literal_eval() 대신 eval()을 사용하지 마세요.

컴프리헨션으로 항목 변환 또는 필터링하기

컴프리헨션을 사용하면 결과를 만들면서 조건을 적용하거나 항목을 변환할 수 있습니다. 다음 예제는 숫자 문자만 남깁니다.

text = "P y 3"
digits = [char for char in text if char.isdigit()]
print(digits)

[char.lower() for char in text if char.isalpha()]처럼 조건에 맞는 문자를 변환할 수도 있습니다. 컴프리헨션은 문자열을 문자 단위로 순회합니다. 항목을 단어로 다뤄야 한다면 먼저 split()을 호출한 다음 그 단어 리스트에 컴프리헨션을 적용하세요.

적절한 방법 선택하기

  • 문자 하나씩을 항목으로 만들려면 list(text)를 사용합니다.
  • 공백으로 나뉜 단어에는 text.split()을, 단순하고 일관된 구분자로 나뉜 필드에는 text.split(separator)를 사용합니다.
  • 입력이 Python 리터럴 데이터일 때만 ast.literal_eval()을 사용하고, 결과 타입을 확인하며 형식이 잘못된 텍스트를 처리합니다.
  • JSON에는 json.loads()를, 따옴표로 묶인 CSV 필드에는 Python의 csv 모듈을 사용합니다.
  • 항목을 필터링하거나 변환해야 할 때는 컴프리헨션을 사용합니다.

변환 전에 입력 형식이 무엇을 보장하는지 확인하세요. 외부 텍스트가 프로그램으로 들어오는 경계에서 결과의 타입과 필수 필드를 검증하고, 잘못된 데이터는 호출하는 코드가 처리할 수 있는 방식으로 알리세요.