2016-11-20 8 views

答えて

2

あなたのループは、文字がphraseでないとき、文字フレーズに応じbreakにある場合は、代わりにあなたがチェックする必要がありpunに追加されます。それまでは、あなたが継続的にpunに文字を追加します。

for item in string: 
    if item in phrase: 
     break 
    pun += item 

それは正しく"dj"を出力し、実行するとき。以前のアプローチは十分ではない場合

またitertoolsからtakewhileを検討することもでき:

使用していないさらに別のアプローチ
>>> "".join(takewhile(lambda x: x not in phrase, string)) 
"dj" 

breakかどうかを示すbooleanフラグを使用してすることができました(?) 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) 
+0

! - # – CAVS

+0

は、あなたが任意の(項目== I iのフレーズで) '場合に'使用することができます'break 'の前に評価する。 –

+0

これを行うための別の方法があります。ブレークを使用したくないです。 – CAVS

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) 
+0

フレーズが部分文字列でないとエラーになります文字列の単純な 'if phrase in string:' checkはそれを '修正'するのに十分でしょう。 – Nf4r

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')) 
関連する問題