如何将字符串分割为字符列表?

671

我该如何将一个字符串拆分成字符列表?str.split不能用。

"foobar"    →    ['f', 'o', 'o', 'b', 'a', 'r']

15
在Python中,字符串除了替换操作外,在所有方面都是字符数组。你可以使用切片、索引或按索引查找项等操作。 - dansalmo
5
链接到另一个方向 - Tobias Kienzler
请参见 https://dev59.com/43RB5IYBdhLWcg3wCjYV,以了解如何将字符串拆分为单词。 - Karl Knechtel
16个回答

1186
使用 list 构造函数:
>>> list("foobar")
['f', 'o', 'o', 'b', 'a', 'r']

list使用从迭代输入可迭代对象获取的项目构建一个新列表。字符串是可迭代的-- 迭代它会在每个迭代步骤中产生一个单独的字符。


2
在我看来,这种方法比 Ruby 方法好多了,你可以自由地在序列类型之间进行转换,甚至更好的是,在 C 级别上实现。 - arthurprs
我想在这里设置标记来避免这样做...但是如果你想要可调用的话,你可以使用cast_method = lambda x:[x]来避免这种行为。 - madzohan
@Doogle:从功能上来看,虽然字符串是一个对象并且可以调用 split() 方法,但列表是一个函数,因此不能在其上调用 list() 方法。 - karatedog
这在最新的 R 版本中不再起作用,我想。 - Delta._.43

92
你将字符串传递给list()函数。
s = "mystring"
l = list(s)
print l

82

您也可以用非list()的方式来非常简单地完成它:

>>> [c for c in "foobar"]
['f', 'o', 'o', 'b', 'a', 'r']

4
欢迎来到 stackoverflow。请问您可以稍微延申一下答案并解释一下它是如何解决问题的吗? - Nagama Inamdar
31
这只是一个简单的 "for" 循环,没有太多需要解释的。我认为你应该阅读有关数据结构的 Python 教程,特别是列表推导式。 - WhyNotHugo
4
这意味着list(map(lambda c: c, iter("foobar"))),但更易读且更有意义。 - InQβ

55
如果你想逐个字符地处理字符串,那么有多种选择。
uhello = u'Hello\u0020World'

使用列表推导式:

print([x for x in uhello])

输出:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

使用map:

print(list(map(lambda c2: c2, uhello)))

输出:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

调用内置的列表函数:

print(list(uhello))

输出:

['H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd']

使用for循环:

for c in uhello:
    print(c)

输出:

H
e
l
l
o

W
o
r
l
d

2
这些方法的性能特征是否有所不同? - qxzsilver

41

如果你只需要一个字符数组:

arr = list(str)
如果你想按特定的分隔符拆分字符串:
# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")

25

我探索了另外两种方法来完成这个任务。对于某些人可能会有所帮助。

第一种方法很简单:

In [25]: a = []
In [26]: s = 'foobar'
In [27]: a += s
In [28]: a
Out[28]: ['f', 'o', 'o', 'b', 'a', 'r']

第二种方法使用 maplambda 函数。这种方法适用于更复杂的任务:

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

例如

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

详见Python文档获取更多方法。


第一种方法非常简单。人们是否有想要更复杂的东西的原因? - undrline - Reinstate Monica
你好!第一个选项确实很简单。然而,第二个选项具有更好的处理更复杂任务的潜力。 - Alexey Milogradov

24
任务可以简化为遍历字符串中的字符并将它们收集到一个列表中。最朴素的解决方案看起来像是:
result = []
for character in string:
    result.append(character)
当然,它可以简化为:
result = [character for character in string]

但仍然有更短的解决方案可以完成相同的事情。

list 构造函数可用于将任何 可迭代对象(迭代器、列表、元组、字符串等)转换为列表。

>>> list('abc')
['a', 'b', 'c']

最大的优点是它在Python 2和Python 3中使用方式相同。

另外,从Python 3.5开始(感谢神奇的PEP 448),现在可以通过将可迭代对象拆包到空列表字面量中来构建列表:

>>> [*'abc']
['a', 'b', 'c']

这比直接调用 list 构造函数更加整洁,并且在某些情况下更有效率。

我建议不要使用基于 map 的方法,因为在 Python 3 中,map 不会返回列表。请参见 如何在Python 3中使用filter、map和reduce


1
我认为最后一个提案非常好。但我不明白为什么你要重新审视其他方法,(其中大部分)已经在这里发布过了,并且会分散注意力,让人无法专注于那个惊人的Python 3.5解决方案! - MSeifert

19
split()内置函数只能根据某些条件将值分离,但在单个单词中无法满足条件。因此,可以借助list()解决这个问题。它会内部调用数组,并基于数组存储值。

假设,

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

16

将它们解压:

word = "Paralelepipedo"
print([*word])

11

将字符串 s 分割的最简单方法是将其传递给 list()。因此,

s = 'abc'
s_l = list(s) #  s_l is now ['a', 'b', 'c']

你也可以使用列表推导式,虽然它的效果与上面的代码相同,但不如上面的代码简洁:

s_l = [c for c in s]

还有其他方法,但这些应该足够了。如果以后想要重新组合它们,使用简单的调用"".join(s_l)将把列表作为字符串返回...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接