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?
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?
Risposte:
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']
Hai bisogno di un elenco
cast_method = lambda x: [x]
Prendi la stringa e la passi a list ()
s = "mystring"
l = list(s)
print l
Puoi anche farlo in questo modo molto semplice senza list ():
>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
for
, non c'è molto da spiegare. Penso che dovresti leggere il tutorial di Python sulle strutture di dati , in particolare la comprensione dell'elenco.
list(map(lambda c: c, iter("foobar")))
, ma più leggibile e significativo.
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
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 map
e lambda
funzione. 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 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.
list
costruttore 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 list
direttamente il costruttore.
Vorrei consigliare di non utilizzare map
approcci basati su, perché map
non non restituisce un elenco in Python 3. Vedere Come filtro di uso, carta e ridurre in Python 3 .
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']
Disimballali:
word = "Paralelepipedo"
print([*word])
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
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))])
>>> 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.
for c in a: print c
è molto più diretto