web-dev-qa-db-fra.com

Briser la chaîne en une liste de caractères dans Python

Donc, ce que je veux faire est essentiellement sucer une ligne de txt à partir d'un fichier .txt, puis attribuer les caractères à une liste, puis créer une liste de tous les caractères distincts dans une liste.

Donc, une liste de listes.

Pour le moment, j'ai essayé:

fO = open(filename, 'rU')
fL = fO.readlines()

et c'est tout im up to. Je ne sais pas trop comment extraire les caractères individuels et les assigner à une nouvelle liste.

Je veux faire quelque chose comme:

fL = 'FHFF HHXH XXXX HFHX' 

^^^ c'est donc la ligne que j'ai tirée du fichier .txt.

Et puis le transformer en ceci:

['F', 'H', 'F', 'F', 'H' ...] 

^^^ et cela étant la nouvelle liste, avec chaque caractère isolé.

52
FlexedCookie

Les chaînes sont itérables (comme une liste).

J'interprète que vous voulez vraiment quelque chose comme:

fd = open(filename,'rU')
chars = []
for line in fd:
   for c in line:
       chars.append(c)

ou

fd = open(filename, 'rU')
chars = []
for line in fd:
    chars.extend(line)

ou

chars = []
with open(filename, 'rU') as fd:
    map(chars.extend, fd)

les caractères contiendraient tous les caractères du fichier.

22
koblas

Vous pouvez le faire en utilisant liste :

new_list = list(fL)

Sachez que tous les espaces de la ligne seront inclus dans cette liste, à ma connaissance.

117
Elliot Bonneville

Je suis un peu en retard il semble être, mais ...

a='hello'
print list(a)
# ['h','e','l','l', 'o']
53
Oscar

Donc, pour ajouter la chaîne hello à une liste sous forme de caractères individuels, essayez ceci:

newlist = []
newlist[:0] = 'hello'
print (newlist)

  ['h','e','l','l','o']

Cependant, c'est plus facile à faire:

splitlist = list(newlist)
print (splitlist)
8
Tim
fO = open(filename, 'rU')
lst = list(fO.read())
7
John La Rooy
a='hello world'
map(lambda x:x, a)

['Bonjour le monde']

Un moyen simple consiste à utiliser la fonction "map ()".

4
shuaiming

Ou utilisez une compréhension de liste sophistiquée, supposée être "plus efficace en calcul", lorsque vous travaillez avec de très gros fichiers/listes

fd = open(filename,'r')
chars = [c for line in fd for c in line if c is not " "]
fd.close()

Btw: La réponse qui a été acceptée ne tient pas compte des espaces blancs ...

4
user2489252

Dans python beaucoup de choses sont éditables, y compris les fichiers et les chaînes. Itérer sur un gestionnaire de fichiers vous donne une liste de toutes les lignes de ce fichier. Une itération sur une chaîne vous donne une liste de tous les caractères de ce fichier. chaîne.

charsFromFile = []
filePath = r'path\to\your\file.txt' #the r before the string lets us use backslashes

for line in open(filePath):
    for char in line:
        charsFromFile.append(char) 
        #apply code on each character here

ou si vous voulez un one liner

#the [0] at the end is the line you want to grab.
#the [0] can be removed to grab all lines
[list(a) for a in list(open('test.py'))][0]  

.

.

Edit: comme Agf le mentionne, vous pouvez utiliser itertools.chain.from_iterable

Sa méthode est meilleure, à moins que vous ne souhaitiez pouvoir spécifier les lignes à saisir list(itertools.chain.from_iterable(open(filename, 'rU)))

Cela nécessite toutefois de se familiariser avec les outils informatiques, et perd donc un peu de lisibilité.

Si vous voulez seulement parcourir les caractères, et ne vous souciez pas de stocker une liste, alors j'utiliserais les boucles for imbriquées. Cette méthode est aussi la plus lisible.

3
Mr. Me

Python3.5 + permet l’utilisation de PEP 448 - Généralisations de décompression étendues :

>>> string = 'hello'
>>> [*string]
['h', 'e', 'l', 'l', 'o']

C'est une spécification de la syntaxe du langage, donc c'est plus rapide que d'appeler list:

>>> from timeit import timeit
>>> timeit("list('hello')")
0.3042821969866054
>>> timeit("[*'hello']")
0.1582647830073256
2
cs95

Comme les chaînes sont des séquences (immuables), elles peuvent être décompactées de la même manière que des listes:

with open(filename, 'rU') as fd:
    multiLine = fd.read()
    *lst, = multiLine

Lorsque vous exécutez map (lambda x: x, multiLine), cela est nettement plus efficace, mais renvoie en fait un objet map au lieu d'une liste.

with open(filename, 'rU') as fd:
    multiLine = fd.read()
    list(map(lambda x: x, multiLine))

Transformer l'objet de la carte en liste prendra plus de temps que la méthode de décompression.

0
ol mighty