如何将字符串分割为字符列表?Str.split不起作用。

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

当前回答

下面是一个很好的脚本,可以帮助你找到最有效的方法:

import timeit
from itertools import chain

string = "thisisthestringthatwewanttosplitintoalist"

def getCharList(str):
  return list(str)

def getCharListComp(str):
  return [char for char in str]

def getCharListMap(str):
  return list(map(lambda c: c, str))

def getCharListForLoop(str):
  list = []
  for c in str:
    list.append(c)

def getCharListUnpack(str):
  return [*str]

def getCharListExtend(str):
  list = []
  return list.extend(str)

def getCharListChain(str):
  return chain(str)
 
time_list = timeit.timeit(stmt='getCharList(string)', globals=globals(), number=1)
time_listcomp = timeit.timeit(stmt='getCharListComp(string)', globals=globals(), number=1)
time_listmap = timeit.timeit(stmt='getCharListMap(string)', globals=globals(), number=1)
time_listforloop = timeit.timeit(stmt='getCharListForLoop(string)', globals=globals(), number=1)
time_listunpack = timeit.timeit(stmt='getCharListUnpack(string)', globals=globals(), number=1)
time_listextend = timeit.timeit(stmt='getCharListExtend(string)', globals=globals(), number=1)
time_listchain = timeit.timeit(stmt='getCharListChain(string)', globals=globals(), number=1)

print(f"Execution time using list constructor is {time_list} seconds")
print(f"Execution time using list comprehension is {time_listcomp} seconds")
print(f"Execution time using map is {time_listmap} seconds")
print(f"Execution time using for loop is {time_listforloop} seconds")
print(f"Execution time using unpacking is {time_listunpack} seconds")
print(f"Execution time using extend is {time_listextend} seconds")
print(f"Execution time using chain is {time_listchain} seconds")

其他回答

如果希望只读访问字符串,可以直接使用数组表示法。

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'

对于不使用regexp的测试可能很有用。 字符串是否包含结束换行符?

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

这个任务可以归结为遍历字符串中的字符并将它们收集到一个列表中。最naïve的解决方案是这样的

result = []
for character in string:
    result.append(character)

当然,也可以缩写为just

result = [character for character in string]

但是仍然有更短的解来做同样的事情。

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

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

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

此外,从Python 3.5开始(多亏了强大的PEP 448),现在可以通过将任何可迭代对象解包为空列表文本来构建列表:

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

这比直接调用列表构造函数更简洁,在某些情况下也更有效。

我建议不要使用基于map的方法,因为map在Python 3中不会返回一个列表。请参阅如何在Python 3中使用筛选、映射和还原。

from itertools import chain

string = 'your string'
chain(string)

类似于list(string),但返回的生成器在使用点被延迟计算,因此内存效率高。

将字符串传递给list()

s = "mystring"
l = list(s)
print l

要分割字符串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)将使你的列表恢复到以前的字符串形式…