Разбить строку на список символов в Python - PullRequest
49 голосов
/ 23 марта 2012

Итак, что я хочу сделать, это по существу высосать строку txt из файла .txt, затем назначить символы в список, а затем создать список всех отдельных символов в списке.

Итак, список списков.

На данный момент я попробовал:

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

и это все, что я могу. Я не совсем знаю, как извлечь отдельные символы и назначить их в новый список.

Я хочу сделать что-то вроде:

fL = 'FHFF HHXH XXXX HFHX' 

^^^ так, чтобы быть строкой, которую я получил из файла .txt.

А затем превратите это в это:

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

^^^ и это новый список с каждым отдельным символом.

Ответы [ 10 ]

113 голосов
/ 23 марта 2012

Вы можете сделать это, используя список :

new_list = list(fL)

Помните, что любые пробелы в строке будут включены в этот список, насколько мне известно.

53 голосов
/ 11 июня 2016

Кажется, я немного опоздал, но ...

a='hello'
print list(a)
# ['h','e','l','l', 'o']
22 голосов
/ 23 марта 2012

Строки являются итеративными (как список).

Я интерпретирую, что вы действительно хотите что-то вроде:

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

или

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

или

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

символы будут содержать все символы в файле.

8 голосов
/ 14 января 2014

Таким образом, чтобы добавить строку hello в список в виде отдельных символов, попробуйте следующее:

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

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

Однако это проще сделать:

splitlist = list(newlist)
print (splitlist)
7 голосов
/ 23 марта 2012
fO = open(filename, 'rU')
lst = list(fO.read())
4 голосов
/ 22 июля 2015
a='hello world'
map(lambda x:x, a)

['h', 'e', ​​'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd ']

Простой способ - использовать функцию «map ()».

4 голосов
/ 25 июля 2013

Или используйте причудливое понимание списка, которое должно быть «вычислительно более эффективным» при работе с очень очень большими файлами / списками

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

Кстати: принятый ответ не учитывает пробелы ...

3 голосов
/ 23 марта 2012

В python многие вещи повторяются, включая файлы и строки. Итерирование по обработчику файлов дает вам список всех строк в этом файле. Итерация по строке дает вам список всех символов в этой строке.

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

или если вы хотите один вкладыш

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

.

.

Редактировать: в качестве аргумента вы можете использовать itertools.chain.from_iterable

Его метод лучше, если только вы не хотите указать, какие строки захватывать. list(itertools.chain.from_iterable(open(filename, 'rU)))

Однако для этого необходимо, чтобы вы были знакомы с itertools, и в результате теряется некоторая читаемость

Если вы хотите перебирать только символы и не заботиться о сохранении списка, я бы использовал вложенные циклы for. Этот метод также наиболее читабелен.

1 голос
/ 08 июня 2019

Python3.5 + позволяет использовать PEP 448 - Расширенные обобщения распаковки :

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

Это спецификация синтаксиса языка, поэтому она быстрее, чем вызов list:

>>> from timeit import timeit
>>> timeit("list('hello')")
0.3042821969866054
>>> timeit("[*'hello']")
0.1582647830073256
0 голосов
/ 26 марта 2019

Поскольку строки являются (неизменяемыми) последовательностями, их можно распаковать подобно спискам:

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

При запуске map (lambda x: x, multiLine) это явно более эффективно, но на самом деле возвращаетобъект карты вместо списка.

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

Превращение объекта карты в список займет больше времени, чем метод распаковки.

...