HOWTO · Python

Converter uma string em lista em Python

Saiba quando usar list(), split(), ast.literal_eval() e compreensões de lista para converter strings Python em caracteres, palavras, valores delimitados ou dados de lista validados.

Nesta página

Escolha o método conforme o que cada elemento do resultado deve representar. Use list(text) para obter um elemento por caractere, text.split() para palavras ou valores separados por delimitadores, ast.literal_eval(text) para texto confiável que já representa um literal Python e uma compreensão de lista para filtrar ou transformar elementos. Não use eval() com uma entrada que você não controla completamente: ela pode executar código Python arbitrário.

Converter uma string em caracteres com list()

list() percorre uma string e produz um elemento para cada ponto de código Unicode. Ela não separa uma frase em palavras. Por exemplo, um acento combinante pode ocupar um ponto de código separado, mesmo quando aparece visualmente ligado a uma letra.

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

Isso é útil para operações em nível de caractere. Espaços e sinais de pontuação também são incluídos como caracteres; remova-os ou transforme-os explicitamente se a tarefa exigir isso.

Separar palavras ou valores com split()

Chame split() sem argumentos para separar palavras em sequências de espaços em branco. Espaços no início e no fim são ignorados, e espaços repetidos, tabulações ou quebras de linha funcionam como um único separador.

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

Quando a entrada usa um delimitador conhecido, informe-o explicitamente. Se forem permitidos espaços ao redor de campos separados por vírgulas, remova-os de cada campo depois da divisão:

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

Um separador explícito preserva campos vazios: "red,,blue".split(",") inclui uma string vazia entre as vírgulas. Se o separador não aparecer, a string original será retornada como um único elemento. Use maxsplit para limitar o número de divisões; "red,green,blue".split(",", maxsplit=1) mantém green,blue juntos no segundo elemento.

split() não é um analisador de CSV. Quando os campos puderem conter delimitadores entre aspas, como em "red, bright",blue, use o módulo csv do Python para que as regras de aspas sejam tratadas corretamente.

Analisar texto que representa uma lista

Se o texto já estiver na sintaxe de literais do Python, como "[1, 2, 3]", analise-o com ast.literal_eval(). A função aceita valores e contêineres literais sem avaliar expressões arbitrárias. Ainda assim, o texto precisa ter sintaxe válida; uma entrada malformada pode gerar ValueError ou 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")

Uma análise bem-sucedida não garante que o resultado seja uma lista: por exemplo, "(1, 2)" representa uma tupla. Confira o tipo do resultado antes de usá-lo como lista e trate erros de análise quando a entrada puder variar. Para texto JSON, use json.loads(), pois JSON e a sintaxe de literais do Python são parecidos, mas não idênticos. Trate a entrada como dados; nunca substitua ast.literal_eval() por eval() se o texto não for totalmente controlado.

Transformar ou filtrar com uma compreensão

Uma compreensão pode aplicar uma condição ou transformação enquanto monta o resultado. Neste exemplo, são mantidos apenas os caracteres numéricos:

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

Também é possível transformar os caracteres mantidos, por exemplo, com [char.lower() for char in text if char.isalpha()]. Uma compreensão percorre os caracteres da string. Se os elementos desejados forem palavras, chame split() primeiro e depois aplique a compreensão à lista de palavras.

Escolher o método certo

  • Use list(text) quando cada caractere precisar ser um elemento.
  • Use text.split() para palavras separadas por espaços em branco ou text.split(separator) para campos simples separados por um delimitador consistente.
  • Use ast.literal_eval() somente quando a entrada tiver sido criada para representar dados literais do Python; confira o tipo resultante e trate texto malformado.
  • Use json.loads() para JSON e o módulo csv do Python para campos CSV entre aspas.
  • Use uma compreensão quando também for necessário filtrar ou transformar elementos.

Antes de converter, determine quais garantias o formato da entrada oferece. Valide o tipo resultante e os campos obrigatórios no ponto em que o texto externo entra no programa, e sinalize dados malformados de uma forma que o código chamador possa tratar.