Come dividere una stringa in una matrice di caratteri?


450

Ho provato a cercare sul web le risposte per dividere una stringa in una matrice di caratteri, ma non riesco a trovare un metodo semplice

str.split(//)non sembra funzionare come fa Ruby. C'è un modo semplice per farlo senza loop?


12
In Python, le stringhe sono già array di caratteri per tutti gli scopi tranne la sostituzione. Puoi
dividerli

Risposte:


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

Hai bisogno di un elenco


2
A mio avviso molto meglio del metodo ruby, puoi convertire liberamente tra i tipi di sequenza, anche meglio, a livello C.
Arthurthur

Il costruttore di elenchi è una funzionalità elegante che converte automaticamente la stringa in matrice di caratteri. Da allora, String è una sequenza omogenea di personaggi unicode ed è così bello lavorare con Python e il creatore Guido l'ha resa migliore. Pitone amante per le sue meravigliose capacità.
Doogle,

Voglio che la bandiera qui non faccia questo ... ma comunque se vuoi richiamare potresti sfuggire a questo comportamento usandocast_method = lambda x: [x]
madzohan,


60

Puoi anche farlo in questo modo molto semplice senza list ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']

4
Benvenuto in StackOverflow. Ti dispiacerebbe estendere un po 'la risposta per spiegare come risolve il problema.
NJInamdar,

21
Questo è un semplice for, non c'è molto da spiegare. Penso che dovresti leggere il tutorial di Python sulle strutture di dati , in particolare la comprensione dell'elenco.
WhyNotHugo

4
Questo significa solo list(map(lambda c: c, iter("foobar"))), ma più leggibile e significativo.
no1xsyzy il

41

Se vuoi elaborare la tua stringa un carattere alla volta. hai varie opzioni.

uhello = u'Hello\u0020World'

Utilizzando la comprensione dell'elenco:

print([x for x in uhello])

Produzione:

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

Utilizzando la mappa:

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

Produzione:

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

Chiamata alla funzione Elenco incorporato:

print(list(uhello))

Produzione:

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

Utilizzando per loop:

for c in uhello:
    print(c)

Produzione:

H
e
l
l
o

W
o
r
l
d

Ci sono differenze nelle caratteristiche prestazionali di ciascuno di questi metodi?
qxzsilver,

20

Ho esplorato altri due modi per svolgere questo compito. Potrebbe essere utile per qualcuno.

Il primo è semplice:

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

E il secondo uso mape lambdafunzione. Potrebbe essere appropriato per compiti più complessi:

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

Per esempio

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

Vedi i documenti di Python per altri metodi


Il primo modo è molto semplice. Ci sono ragioni per cui la gente vorrebbe qualcosa di più complesso?
undrline

Ciao! La prima opzione è davvero semplice. Il secondo, tuttavia, ha un potenziale migliore per gestire elaborazioni più complesse.
Alexey Milogradov,

19

Il compito si riduce a scorrere i caratteri della stringa e raccoglierli in un elenco. La soluzione più ingenua sarebbe simile

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

Certo, può essere abbreviato in giusto

result = [character for character in string]

ma ci sono ancora soluzioni più brevi che fanno la stessa cosa.

listcostruttore può essere utilizzato per convertire qualsiasi iterabile (iteratori, liste, tuple, stringhe ecc.) in elenco.

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

Il grande vantaggio è che funziona allo stesso modo in Python 2 e Python 3.

Inoltre, a partire da Python 3.5 (grazie al fantastico PEP 448 ) è ora possibile creare un elenco da qualsiasi iterabile scompattandolo in un elenco letterale vuoto:

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

Questo è più ordinato e in alcuni casi più efficiente di chiamare listdirettamente il costruttore.

Vorrei consigliare di non utilizzare mapapprocci basati su, perché mapnon non restituisce un elenco in Python 3. Vedere Come filtro di uso, carta e ridurre in Python 3 .


Penso che l'ultima proposta sia molto bella. Ma non vedo perché hai rivisitato alcuni degli altri approcci, (la maggior parte di essi) sono già stati pubblicati qui e distraggono dalla straordinaria soluzione Python 3.5!
MSeifert,

13

Ho solo bisogno di una serie di caratteri:

arr = list(str)

Se vuoi dividere la str per una particolare str:

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

12

split()la funzione integrata separerà il valore solo sulla base di una determinata condizione, ma nella singola parola non può soddisfare la condizione. Quindi, può essere risolto con l'aiuto di list(). Chiama internamente l'array e memorizzerà il valore sulla base di un array.

Supponiamo,

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


3

Se si desidera leggere solo l'accesso alla stringa, è possibile utilizzare direttamente la notazione dell'array.

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'

Potrebbe essere utile per i test senza usare regexp. La stringa contiene una nuova riga finale?

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

1

Bene, per quanto mi piaccia la versione delle liste, ecco un altro modo più dettagliato che ho trovato (ma è bello, quindi ho pensato di aggiungerlo alla mischia):

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

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)

simile a list(string)ma restituisce un generatore che viene valutato pigramente nel punto di utilizzo, quindi memoria efficiente.


Non sono sicuro di dove sarebbe più utile della stringa stessa, che è iterabile.
Ry-

0
>>> for i in range(len(a)):
...     print a[i]
... 

dove a è la stringa che si desidera separare. I valori "a [i]" sono il carattere individuale della stringa che potrebbero essere aggiunti a un elenco.


1
for c in a: print cè molto più diretto
James Waldby - jwpat7,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.