如何将字符串拆分为字符数组?


449

我试图在网上四处寻找将字符串拆分为字符数组的答案,但似乎找不到一个简单的方法

str.split(//)似乎不像Ruby那样工作。有没有一种简单的方法可以不循环?


12
在Python中,字符串已经是用于替换以外目的的所有字符数组。您可以切片他们,引用或查找由折射率等项目
dansalmo

Answers:


859
>>> s = "foobar"
>>> list(s)
['f', 'o', 'o', 'b', 'a', 'r']

你需要清单


2
我认为这比ruby方法好得多,您可以在C级中自由地甚至更好地在序列类型之间进行转换。
arthurprs 2011年

列表构造函数是一个优雅的功能,它可以自动将字符串转换为字符数组。由于String是Unicode字符的同质序列,因此与Python一起使用非常酷,而创建者Guido使其变得更好。喜欢python的强大功能。
Doogle

我希望这里的标志不要执行此操作...但是无论如何,如果您希望可调用,则可以使用cast_method = lambda x: [x]
madzohan


60

您也可以不用list()来以非常简单的方式进行操作:

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

4
欢迎使用stackoverflow。您介意将答案扩展一点来说明它如何解决问题。
NJInamdar

21
这仅仅是一个for,没有太多的解释。我认为您应该阅读有关数据结构,尤其是列表理解的python教程。
WhyNotHugo 2015年

4
这只是意味着list(map(lambda c: c, iter("foobar"))),但更具可读性和意义。
no1xsyzy

40

如果您想一次处理您的字符串一个字符。您有多种选择。

uhello = u'Hello\u0020World'

使用列表理解:

print([x for x in uhello])

输出:

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

使用地图:

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

每种方法的性能特征是否存在差异?
qxzsilver

20

我探索了完成此任务的另外两种方法。这可能对某人有帮助。

第一个很简单:

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文档


第一种方法很简单。人们是否有理由想要更复杂的东西?
解散

你好!第一选择确实很简单。不过,第二种方法在处理更复杂的处理方面具有更大的潜力。
阿列克谢·米洛格拉多夫

19

任务归结为遍历字符串中的字符并将它们收集到列表中。最幼稚的解决方案看起来像

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基于方法的方法,因为map不会在Python 3中返回列表。请参见如何在Python 3 中使用过滤,映射和精简


我认为最后一个建议非常好。但是我不明白为什么您会重新讨论其他一些方法,(其中大多数)已经发布在这里,并分散了令人赞叹的 python 3.5解决方案!
MSeifert '16

13

我只需要一个字符数组:

arr = list(str)

如果要用特定的str拆分str:

# str = "temp//temps" will will be ['temp', 'temps']
arr = str.split("//")

12

split()内置函数将仅根据特定条件分隔值,但在单个单词中,它无法满足条件。因此,可以借助来解决list()。它在内部调用Array,它将基于数组存储值。

假设,

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


3

如果您希望只读访问该字符串,则可以直接使用数组符号。

Python 2.7.6 (default, Mar 22 2014, 22:59:38) 
[GCC 4.8.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> t = 'my string'
>>> t[1]
'y'

在不使用正则表达式的情况下可能对测试很有用。字符串是否包含结尾换行符?

>>> t[-1] == '\n'
False
>>> t = 'my string\n'
>>> t[-1] == '\n'
True

1

好吧,就像我喜欢列表版本一样,这是我发现的另一种更为冗长的方式(但它很酷,所以我认为我应该将其添加到列表中):

>>> text = "My hovercraft is full of eels"
>>> [text[i] for i in range(len(text))]
['M', 'y', ' ', 'h', 'o', 'v', 'e', 'r', 'c', 'r', 'a', 'f', 't', ' ', 'i', 's', ' ', 'f', 'u', 'l', 'l', ' ', 'o', 'f', ' ', 'e', 'e', 'l', 's']

camelcase = ''.join([text[i].upper() if i % 2 else text[i].lower() for i in range(len(text))])
whereisalext

1
from itertools import chain

string = 'your string'
chain(string)

list(string)生成器类似,但返回在使用时延迟评估的生成器,因此内存效率高。


不知道在哪里比字符串本身更有用,这是可迭代的。
Ry-

0
>>> for i in range(len(a)):
...     print a[i]
... 

其中a是您要分离的字符串。值“ a [i]”是字符串的各个字符,可以将它们附加到列表中。


1
for c in a: print c更为直接
詹姆斯·沃尔德比-jwpat7
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.