Comment diviser une chaîne en tableau de caractères?

450

J'ai essayé de chercher sur le Web des réponses pour diviser une chaîne en un tableau de caractères, mais je n'arrive pas à trouver une méthode simple

str.split(//)ne semble pas fonctionner comme Ruby. Existe-t-il un moyen simple de le faire sans boucle?

Adrian
la source
12
En Python, les chaînes sont déjà des tableaux de caractères à toutes fins sauf remplacement. Vous pouvez les découper, référencer ou rechercher des éléments par index, etc.
dansalmo
4
Lien vers une autre direction
Tobias Kienzler

Réponses:

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

Vous avez besoin d'une liste

user225312
la source
2
À mon avis, bien mieux que la méthode ruby, vous pouvez convertir librement, encore mieux, entre les types de séquence au niveau C.
arthurprs
Le constructeur de liste est une fonctionnalité élégante qui convertit automatiquement la chaîne en tableau de caractères. Depuis, String est une séquence homogène de caractères Unicode, c'est tellement cool de travailler avec Python et le créateur Guido l'a rendu meilleur. Aimer le python pour ses merveilleuses capacités.
Doogle
Je veux que le drapeau ici ne fasse pas ça ... mais de toute façon si vous voulez callable vous pouvez échapper à ce comportement en utilisantcast_method = lambda x: [x]
madzohan
72

Vous prenez la chaîne et la passez à list ()

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

Vous pouvez également le faire de cette manière très simple sans list ():

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']
Lewis James-Odwin
la source
4
Bienvenue sur stackoverflow. Pourriez-vous étendre un peu la réponse pour expliquer comment cela résout le problème?
NJInamdar
21
C'est simple for, il n'y a pas grand-chose à expliquer. Je pense que vous devriez lire le tutoriel python sur les structures de données , en particulier la compréhension des listes.
WhyNotHugo
4
Cela signifie simplement list(map(lambda c: c, iter("foobar"))), mais plus lisible et significatif.
no1xsyzy
41

Si vous souhaitez traiter votre chaîne un caractère à la fois. vous avez différentes options.

uhello = u'Hello\u0020World'

Utilisation de la compréhension de liste:

print([x for x in uhello])

Production:

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

En utilisant la carte:

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

Production:

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

Appeler la fonction de liste intégrée:

print(list(uhello))

Production:

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

Utilisation de la boucle for:

for c in uhello:
    print(c)

Production:

H
e
l
l
o

W
o
r
l
d
Sid
la source
Existe-t-il des différences dans les caractéristiques de performance de chacune de ces méthodes?
qxzsilver
20

J'ai exploré deux autres façons d'accomplir cette tâche. Cela peut être utile pour quelqu'un.

Le premier est simple:

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

Et le second utilise mapet lambdafonctionne. Il peut être approprié pour des tâches plus complexes:

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

Par exemple

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

Voir les documents python pour plus de méthodes

Alexey Milogradov
la source
La première façon est très simple. Y a-t-il des raisons pour lesquelles les gens voudraient quelque chose de plus complexe?
undrline
salut! La première option est en effet simple. Le second, cependant, a un meilleur potentiel pour gérer des traitements plus complexes.
Alexey Milogradov
19

La tâche se résume à parcourir les caractères de la chaîne et à les rassembler dans une liste. La solution la plus naïve ressemblerait à

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

Bien sûr, il peut être raccourci

result = [character for character in string]

mais il existe encore des solutions plus courtes qui font la même chose.

listLe constructeur peut être utilisé pour convertir n'importe quel itérable (itérateurs, listes, tuples, chaîne, etc.) en liste.

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

Le gros avantage est qu'il fonctionne de la même manière dans Python 2 et Python 3.

De plus, à partir de Python 3.5 (grâce à l'impressionnant PEP 448 ), il est maintenant possible de construire une liste à partir de n'importe quel itérable en la décompressant dans un littéral de liste vide:

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

C'est plus propre et dans certains cas plus efficace que d'appeler listdirectement constructeur.

Je déconseille d'utiliser des mapapproches basées sur, car mapne renvoie pas de liste en Python 3. Voir Comment utiliser le filtre, la carte et la réduction en Python 3 .

vaultah
la source
Je pense que la dernière proposition est très agréable. Mais je ne vois pas pourquoi vous avez revu certaines des autres approches, (la plupart d'entre elles) ont déjà été postées ici et distraient de la solution python 3.5 incroyable !
MSeifert
13

Si vous avez juste besoin d'un tableau de caractères:

arr = list(str)

Si vous souhaitez diviser la chaîne en une chaîne particulière:

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

split()La fonction intégrée ne séparera la valeur que sur la base d'une certaine condition, mais en un mot, elle ne peut pas remplir la condition. Ainsi, il peut être résolu à l'aide de list(). Il appelle en interne le tableau et il stockera la valeur sur la base d'un tableau.

Supposer,

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
la source
4

Déballez-les:

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

Si vous souhaitez accéder en lecture seule à la chaîne, vous pouvez utiliser directement la notation de tableau.

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'

Peut être utile pour tester sans utiliser regexp. La chaîne contient-elle un retour à la ligne de fin?

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

Eh bien, bien que j'aime la version de liste (s), voici une autre façon plus verbeuse que j'ai trouvée (mais c'est cool, alors j'ai pensé l'ajouter à la mêlée):

>>> 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
la source
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)

similaire à list(string)mais renvoie un générateur qui est évalué paresseusement au point d'utilisation, donc efficace en mémoire.

minggli
la source
Je ne sais pas où cela serait plus utile que la chaîne elle-même, ce qui est itérable.
Ry-
0
>>> for i in range(len(a)):
...     print a[i]
... 

où a est la chaîne que vous souhaitez séparer. Les valeurs "a [i]" sont le caractère individuel de la chaîne, elles peuvent être ajoutées à une liste.

Abass Sesay
la source
1
for c in a: print cest beaucoup plus direct
James Waldby - jwpat7