phrase='!_#@%'
pun=''
string='dj_khaled'
for item in string:
if item not in phrase:
pun=pun+item
print(pun)
我的问题是,我得到的输出是djkhaled而不是它应该是dj,所以基本上,我想在某个符号出现之前包含每个字符。字符串是alphanumberic。
答案 0 :(得分:2)
只要某个字符不在pun
中,您的循环就会添加到phrase
,而应该检查字符是否在短语中并break
相应。在此之前,您不断向pun
添加字符:
for item in string:
if item in phrase:
break
pun += item
执行后,现在可以正确打印"dj"
。
如果之前的方法不够,您还可以考虑takewhile
itertools
:
>>> "".join(takewhile(lambda x: x not in phrase, string))
"dj"
另一种不使用break
(?)的方法可以是使用一个布尔标志来指示phrase
中的值是否被看到,然后你可以在决定时采取行动如果您应该添加到pun
:
phrase='!_#@%'
pun=''
string='dj!khaled'
seen = False
for item in string:
if item in phrase:
seen = True
if not seen:
pun += item
print(pun)
答案 1 :(得分:0)
使用index
方法建立索引可以更轻松地完成此任务:
pun = string[:string.index(phrase)]
print(pun)
如果我们有多个“短语”,有些可能不在字符串中:
phrase=['_','j','z']
pun = string[:min([string.index(i) for i in phrase if i in string])]
print(pun)
答案 2 :(得分:0)
另一种方法是使用while
循环
forbidden ='!_#@%'
string='dj_khaled'
result =""
i = 0
while i<len(string) and string[i] not in forbidden:
result = result + string[i]
i = i+1
print( result )
但这更容易搞砸,但在功能上与在Jin的第一个例子中使用break
相同。
以及我在评论中提到的功能版本
def myfun(string):
forbidden ='!_#@%'
result = ""
for c in string:
if c in forbidden:
return result #normally here you put the break
result = result + c
return result
print( myfun('dj_khaled') )