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?


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

Réponses:


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

Vous avez besoin d'une liste


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


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

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

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


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 .


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("//")

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


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

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

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.


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.


1
for c in a: print cest beaucoup plus direct
James Waldby - jwpat7
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.