问题:通过作为列表传入的分隔符将字符串拆分为单词列表。
字符串:"After the flood ... all the colors came out."
所需的输出:['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
我已经编写了以下函数 - 注意我知道有更好的方法可以使用函数内置的一些pythons来分割字符串但是为了学习我想我会这样:
def split_string(source,splitlist):
result = []
for e in source:
if e in splitlist:
end = source.find(e)
result.append(source[0:end])
tmp = source[end+1:]
for f in tmp:
if f not in splitlist:
start = tmp.find(f)
break
source = tmp[start:]
return result
out = split_string("After the flood ... all the colors came out.", " .")
print out
['After', 'the', 'flood', 'all', 'the', 'colors', 'came out', '', '', '', '', '', '', '', '', '']
我无法弄清楚为什么“出来”不会分成“来”和“出”两个单独的词。就好像两个单词之间的空白字符被忽略一样。我认为输出的其余部分是垃圾,源于与“出来”问题相关的问题。
编辑:
我按照@ Ivc的建议,提出了以下代码:
def split_string(source,splitlist):
result = []
lasti = -1
for i, e in enumerate(source):
if e in splitlist:
tmp = source[lasti+1:i]
if tmp not in splitlist:
result.append(tmp)
lasti = i
if e not in splitlist and i == len(source) - 1:
tmp = source[lasti+1:i+1]
result.append(tmp)
return result
out = split_string("This is a test-of the,string separation-code!"," ,!-")
print out
#>>> ['This', 'is', 'a', 'test', 'of', 'the', 'string', 'separation', 'code']
out = split_string("After the flood ... all the colors came out.", " .")
print out
#>>> ['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
out = split_string("First Name,Last Name,Street Address,City,State,Zip Code",",")
print out
#>>>['First Name', 'Last Name', 'Street Address', 'City', 'State', 'Zip Code']
out = split_string(" After the flood ... all the colors came out...............", " ."
print out
#>>>['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
答案 0 :(得分:3)
您不需要内循环调用。这就够了:
def split_string(source,splitlist):
result = []
for e in source:
if e in splitlist:
end = source.find(e)
result.append(source[0:end])
source = source[end+1:]
return result
您可以通过检查源[:end]是否为空字符串来消除“垃圾”(即空字符串),然后再将其附加到列表中。
答案 1 :(得分:2)
你似乎在期待:
source = tmp[start:]
修改外部for循环迭代的source
。它不会 - 该循环将继续遍历您给它的字符串,而不是现在使用该名称的任何对象。这可能意味着您所处的角色可能不在source
的左侧。
不要试图这样做,而是用这种方式跟踪字符串中的当前索引:
for i, e in enumerate(source):
...
以及您要追加的内容始终为source[lasti+1:i]
,您只需要跟踪lasti
。
答案 2 :(得分:2)
我认为如果你只使用上面给出的字符串中的单词,你可以使用正则表达式。
>>> import re
>>> string="After the flood ... all the colors came out."
>>> re.findall('\w+',string)
['After', 'the', 'flood', 'all', 'the', 'colors', 'came', 'out']
答案 3 :(得分:0)
为什么要做太多事情,
就这么简单,试试..
str.split(strSplitter , intMaxSplitCount)
intMaxSplitCount是可选的
在你的情况下,你也要做一些Houskeeping,如果你想避免......
一个是你可以替换它,比如str.replace(".","", 3)
3是可选的,它只会替换前三个点
所以简而言之,你必须做到以下,
print ((str.replace(".", "",3)).split(" "))
它会打印你想要的东西
答案 4 :(得分:0)
[x for x in a.replace('.', '').split(' ') if len(x)>0]
这里'a'是你的输入字符串。
答案 5 :(得分:0)
更简单的方法,至少看起来更简单..
import string
def split_string(source, splitlist):
table = string.maketrans(splitlist, ' ' * len(splitlist))
return string.translate(source, table).split()