Разбить строку на список символов в Python
По сути, я хочу высосать строку текста из файла, назначить символы в список и создать список всех отдельных символов в списке - список списков.
На данный момент я попробовал это:
fO = open(filename, 'rU')
fL = fO.readlines()
Это все, что у меня есть. Я не совсем знаю, как извлечь отдельные символы и назначить их в новый список.
Строка, которую я получаю из файла, будет выглядеть примерно так:
fL = 'FHFF HHXH XXXX HFHX'
Я хочу включить его в этот список, чтобы каждый отдельный символ был отдельным:
['F', 'H', 'F', 'F', 'H', ...]
Ответы
Ответ 1
Строки являются итерабельными (точно так же, как список).
Я интерпретирую, что вы действительно хотите что-то вроде:
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)
символы будут содержать все символы в файле.
Ответ 2
Вы можете сделать это, используя список:
new_list = list(fL)
Помните, что любые пробелы в строке будут включены в этот список, насколько мне известно.
Ответ 3
Я немного опаздываю, но...
a='hello'
print list(a)
# ['h','e','l','l', 'o']
Ответ 4
Поэтому, чтобы добавить строку hello
в список в виде отдельных символов, попробуйте следующее:
newlist = []
newlist[:0] = 'hello'
print (newlist)
['h','e','l','l','o']
Однако это проще сделать:
splitlist = list(newlist)
print (splitlist)
Ответ 5
fO = open(filename, 'rU')
lst = list(fO.read())
Ответ 6
Или используйте причудливое понимание списка, которое должно быть "более эффективно вычисляемо" при работе с очень большими файлами/списками
fd = open(filename,'r')
chars = [c for line in fd for c in line if c is not " "]
fd.close()
Btw: ответ, который был принят, не учитывает пробелы...
Ответ 7
a='hello world'
map(lambda x:x, a)
['h', 'e', 'l', 'l', 'o', '', 'w', 'o', 'r', 'l', 'd']
Простым способом является использование функции "map()".
Ответ 8
В 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]
.
.
Изменить: в качестве упоминания agf вы можете использовать itertools.chain.from_iterable
Его метод лучше, если вы не хотите, чтобы указать, какие линии захватывать
list(itertools.chain.from_iterable(open(filename, 'rU)))
Однако это требует, чтобы кто-то был знаком с itertools и, как результат, терял некоторую удобочитаемость
Если вы хотите только перебирать символы и не заботиться о сохранении списка, я бы использовал вложенные для циклов. Этот метод также является наиболее читаемым.
Ответ 9
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
Ответ 10
Поскольку строки являются (неизменяемыми) последовательностями, они могут быть распакованы подобно спискам:
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))
Превращение объекта карты в список займет больше времени, чем метод распаковки.