¿Cómo dividir una cadena en una matriz de caracteres?

450

Intenté buscar respuestas en la web para dividir una cadena en una serie de caracteres, pero parece que no puedo encontrar un método simple

str.split(//)no parece funcionar como lo hace Ruby. ¿Hay una manera simple de hacer esto sin bucle?

Adrian
fuente
12
En Python, las cadenas ya son matrices de caracteres para todos los fines, excepto el reemplazo. Puede cortarlos, hacer referencia o buscar elementos por índice, etc.
dansalmo
44
Enlace a otra dirección
Tobias Kienzler

Respuestas:

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

Necesitas lista

usuario225312
fuente
2
En mi opinión, mucho mejor que el método ruby, puedes convertir entre tipos de secuencia libremente, incluso mejor, en el nivel C.
arthurprs
El constructor de listas es una característica elegante que convierte automáticamente la cadena en una matriz de caracteres. Desde entonces, String es una secuencia homogénea de caracteres unicode, es genial trabajar con Python y el creador Guido lo ha mejorado. Python amoroso por sus maravillosas capacidades.
Doogle
Quiero que la bandera aquí no haga esto ... pero de todos modos, si quieres llamar, puedes escapar de este comportamiento usandocast_method = lambda x: [x]
madzohan
72

Tomas la cadena y la pasas a list ()

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

También puede hacerlo de esta manera muy simple sin list ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
fuente
44
Bienvenido a stackoverflow. ¿Le importaría extender un poco la respuesta para explicar cómo resuelve el problema?
NJInamdar
21
Esto es un mero for, no hay mucho que explicar. Creo que debería leer el tutorial de Python sobre estructuras de datos , especialmente la comprensión de listas.
WhyNotHugo
44
Esto solo significa list(map(lambda c: c, iter("foobar"))), pero más legible y significativo.
no1xsyzy
41

Si quieres procesar tu Cadena un carácter a la vez. Tienes varias opciones.

uhello = u'Hello\u0020World'

Usando la comprensión de la lista:

print([x for x in uhello])

Salida:

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

Usando el mapa:

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

Salida:

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

Llamada a la función de lista incorporada:

print(list(uhello))

Salida:

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

Utilizando for loop:

for c in uhello:
    print(c)

Salida:

H
e
l
l
o

W
o
r
l
d
Sid
fuente
¿Existen diferencias en las características de rendimiento de cada uno de estos métodos?
qxzsilver
20

Exploré otras dos formas de lograr esta tarea. Puede ser útil para alguien.

El primero es facil:

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

Y el segundo uso mapy lambdafunción. Puede ser apropiado para tareas más complejas:

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 ejemplo

# 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', '', '']

Ver documentos de Python para más métodos.

Alexey Milogradov
fuente
La primera forma es muy simple. ¿Hay razones por las cuales la gente querría algo más complejo?
Desanclar el
¡Hola! La primera opción es simple de hecho. Sin embargo, el segundo tiene un mejor potencial para manejar un procesamiento más complejo.
Alexey Milogradov
19

La tarea se reduce a iterar sobre los caracteres de la cadena y recopilarlos en una lista. La solución más ingenua sería

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

Por supuesto, se puede acortar a solo

result = [character for character in string]

pero todavía hay soluciones más cortas que hacen lo mismo.

listEl constructor se puede utilizar para convertir cualquier iterable (iteradores, listas, tuplas, cadenas, etc.) a la lista.

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

La gran ventaja es que funciona igual en Python 2 y Python 3.

Además, a partir de Python 3.5 (gracias al impresionante PEP 448 ) ahora es posible construir una lista desde cualquier iterable desempacándola en una lista vacía literal:

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

Esto es más ordenado y, en algunos casos, más eficiente que llamar al listconstructor directamente.

Yo le aconsejaría contra el uso de mapenfoques basados, porque mapno no devolver una lista en Python 3. Véase Cómo el uso de filtro, mapa, y reducir en Python 3 .

vaultah
fuente
Creo que la última propuesta es muy buena. Pero no veo por qué volviste a visitar algunos de los otros enfoques, (la mayoría de ellos) ya se han publicado aquí y distraen de la increíble solución de Python 3.5.
MSeifert
13

Yo solo necesito una variedad de caracteres:

arr = list(str)

Si quieres dividir el str por un str particular:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")
Safari
fuente
12

split()la función incorporada solo separará el valor en función de cierta condición, pero en una sola palabra, no puede cumplir la condición. Por lo tanto, se puede resolver con la ayuda de list(). Llama internamente a la matriz y almacenará el valor en función de una matriz.

Suponer,

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
fuente
4

Descomprimirlos:

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

Si desea leer solo el acceso a la cadena, puede usar la notación de matriz directamente.

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'

Podría ser útil para probar sin usar regexp. ¿La cadena contiene una nueva línea final?

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

Bueno, por mucho que me guste la versión de la (s) lista (s), aquí hay otra forma más detallada que encontré (pero es genial, así que pensé en agregarla a la refriega):

>>> 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
fuente
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)

similar a, list(string)pero devuelve un generador que se evalúa perezosamente en el punto de uso, por lo que la memoria es eficiente.

minggli
fuente
No estoy seguro de dónde sería más útil que la cadena en sí, que es iterable.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

donde a es la cadena que desea separar. Los valores "a [i]" son el carácter individual de la cadena que se puede agregar a una lista.

Abass Sesay
fuente
1
for c in a: print ces mucho más directo
James Waldby - jwpat7