在 Python 中将字符串分解为字符列表

本质上,我想从一个文件中吸取一行文本,将字符分配给一个列表,并创建一个列表中所有单独字符的列表——一个列表列表。

目前,我试过这样做:

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

我就知道这么多。我不太清楚如何提取单个字符并将它们分配到一个新列表中。

我从文件中得到的代码是这样的:

fL = 'FHFF HHXH XXXX HFHX'

我想把它变成这个列表,每个单独的字符:

['F', 'H', 'F', 'F', 'H', ...]
197993 次浏览

你可以使用 名单:

new_list = list(fL)

请注意,据我所知,该行中的任何空格都将包括在这个列表中。

字符串是可迭代的(就像列表一样)。

我的理解是,你真的想要这样的东西:

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)

Chars 将包含文件中的所有字符。

fO = open(filename, 'rU')
lst = list(fO.read())

在 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,因此会失去一些可读性

如果您只想在字符上迭代,并且不关心存储列表,那么我将使用嵌套的 for 循环。这种方法也是最具可读性的。

或者在处理非常非常大的文件/列表时,使用一个被认为“计算效率更高”的列表内涵

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

顺便说一下: 被接受的答案没有考虑到空格..。

因此,要将字符串 hello作为单个字符添加到列表中,请尝试这样做:

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


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

然而,这样做更容易:

splitlist = list(newlist)
print (splitlist)
a='hello world'
map(lambda x:x, a)

[‘ h’,‘ e’,‘ l’,‘ l’,‘ o’,’,‘ w’,‘ o’,‘ r’,‘ l’,‘ d’]

一种简单的方法是使用函数“ map ()”。

我似乎有点晚了,但是..。

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

因为字符串是(不可变的)序列,所以它们可以像列表一样被解压缩:

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

在运行 map (lambda x: x,multiLine)时,这显然更有效,但实际上它返回的是 map 对象而不是 list。

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

将 map 对象转换为 list 将比解压缩方法花费更长的时间。

巨蟒 > = 3.5

3.5以上版本允许使用 PEP448-扩展的解包泛化:

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

这是一个语言语法规范,因此比调用 list要快:

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