Como dividir uma string em uma matriz de caracteres?

450

Tentei procurar na web respostas para dividir uma string em uma matriz de caracteres, mas não consigo encontrar um método simples

str.split(//)parece não funcionar como Ruby. Existe uma maneira simples de fazer isso sem fazer loop?

Adrian
fonte
12
No Python, strings já são matrizes de caracteres para todos os fins, exceto para substituição. Você pode cortá-los, de referência ou procurar itens de índice, etc.
dansalmo
4
Link para outra direção
Tobias Kienzler 16/01

Respostas:

860
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

Você precisa de lista

user225312
fonte
2
Na minha opinião, muito melhor que o método ruby, você pode converter entre tipos de sequência livremente, ainda melhor, no nível C.
Arthurprs
O construtor de lista é um recurso elegante que converte automaticamente a string em uma matriz de caracteres. Como String é uma sequência homogênea de caracteres unicode, é muito legal trabalhar com Python, e o criador Guido tornou-o melhor. Python amoroso por suas maravilhosas capacidades.
Doogle
Eu quero que a bandeira aqui não faça isso ... mas de qualquer maneira, se você quiser cast_method = lambda x: [x]
chamar
72

Você pega a string e a passa para list ()

s = "mystring"
l = list(s)
print l
Senthil Kumaran
fonte
60

Você também pode fazer isso de maneira muito simples, sem list ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
fonte
4
Bem-vindo ao stackoverflow. Você se importaria de estender um pouco a resposta para explicar como ela resolve o problema?
NJInamdar
21
Isso é mero for, não há muito o que explicar. Eu acho que você deve ler o tutorial do python sobre estruturas de dados , especialmente compreensão de lista.
precisa saber é o seguinte
4
Isso apenas significa list(map(lambda c: c, iter("foobar"))), mas mais legível e significativo.
no1xsyzy
41

Se você deseja processar sua String, um caractere de cada vez. você tem várias opções.

uhello = u'Hello\u0020World'

Usando a compreensão da lista:

print([x for x in uhello])

Resultado:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Usando o mapa:

print(list(map(lambda c2: c2, uhello)))

Resultado:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Chamando a função de lista incorporada:

print(list(uhello))

Resultado:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

Usando o loop for:

for c in uhello:
    print(c)

Resultado:

H
e
l
l
o

W
o
r
l
d
Sid
fonte
Existem diferenças nas características de desempenho de cada um desses métodos?
qxzsilver 17/02
20

Eu explorei outras duas maneiras de realizar essa tarefa. Pode ser útil para alguém.

O primeiro é fácil:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

E o segundo uso mape lambdafunção. Pode ser apropriado para tarefas mais complexas:

In [36]: s = 'foobar12'
In [37]: a = map(lambda c: c, s)
In [38]: a
Out[38]: ['f', 'o', 'o', 'b', 'a', 'r', '1', '2']

Por exemplo

# isdigit, isspace or another facilities such as regexp may be used
In [40]: a = map(lambda c: c if c.isalpha() else '', s)
In [41]: a
Out[41]: ['f', 'o', 'o', 'b', 'a', 'r', '', '']

Veja docs python para mais métodos

Alexey Milogradov
fonte
A primeira maneira é muito simples. Existem razões pelas quais as pessoas desejam algo mais complexo?
undrline
Olá! A primeira opção é realmente simples. O segundo, no entanto, tem melhor potencial para lidar com processamento mais complexo.
Alexey Milogradov 28/06/19
19

A tarefa se resume a iterar sobre os caracteres da sequência e coletando-os em uma lista. A solução mais ingênua seria

result = []
for character in string:
    result.append(character)

Obviamente, pode ser reduzido para apenas

result = [character for character in string]

mas ainda existem soluções mais curtas que fazem a mesma coisa.

listO construtor pode ser usado para converter qualquer iterável (iteradores, listas, tuplas, string etc.) em lista.

>>> list('abc')
['a', 'b', 'c']

A grande vantagem é que ele funciona da mesma maneira no Python 2 e no Python 3.

Além disso, a partir do Python 3.5 (graças ao incrível PEP 448 ) agora é possível criar uma lista a partir de qualquer iterável, descompactando-a em uma lista vazia literal:

>>> [*'abc']
['a', 'b', 'c']

Isso é mais organizado e, em alguns casos, mais eficiente do que chamar o listconstrutor diretamente.

Eu aconselho contra o uso de mapabordagens baseados, porque mapse não retornar uma lista em Python 3. Veja como filtrar uso, mapa, e reduzir em Python 3 .

vaultah
fonte
Eu acho que a última proposta é muito legal. Mas não vejo por que você revisitou algumas das outras abordagens, (a maioria delas) já foram publicadas aqui e desviam a atenção da incrível solução python 3.5!
MSDIFER #
13

Eu só preciso de uma matriz de caracteres:

arr = list(str)

Se você deseja dividir o str por um str específico:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")
Safári
fonte
12

split()A função embutida separará apenas o valor com base em determinada condição, mas na única palavra, ela não pode atender à condição. Assim, pode ser resolvido com a ajuda de list(). Chama internamente a matriz e armazena o valor com base em uma matriz.

Suponha,

a = "bottle"
a.split() // will only return the word but not split the every single char.

a = "bottle"
list(a) // will separate ['b','o','t','t','l','e']
Anshul Singh Suryan
fonte
4

Desembale-os:

word = "Paralelepipedo"
print([*word])
Enrique Bermúdez
fonte
3

Se você deseja ler apenas o acesso à string, pode usar a notação de matriz diretamente.

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

Pode ser útil para testar sem usar o regexp. A cadeia contém uma nova linha final?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True
Sylvain
fonte
1

Bem, por mais que eu goste da versão da lista, aqui está outra maneira mais detalhada que eu encontrei (mas é legal, então eu pensei em adicioná-la à briga):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']
John Lockwood
fonte
camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
whereisalext
1
from itertools import chain

string = 'your string'
chain(string)

semelhante a, list(string)mas retorna um gerador que é preguiçosamente avaliado no ponto de uso, tornando a memória eficiente.

minggli
fonte
Não tenho certeza de onde isso seria mais útil que a própria string, que é iterável.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

onde a é a sequência que você deseja separar. Os valores "a [i]" são o caractere individual da sequência que eles podem ser anexados a uma lista.

Abass Sesay
fonte
1
for c in a: print cé muito mais direto
James Waldby - jwpat7 26/05