2017-03-20 18 views
0

このプログラムは、大きな文字列内の文字列が重複して出現する回数を数えます。デバッグと実行異なる出力のpythonを与える

入力:

  • 大きい列(VAR名:search_space)< < abababa

  • 小さいストリング(VAR名:SEARCH_STRING)< < ABA

アンサーPycharm 2016.3:の 'Debug Code'を使用してPycharm 2016.3で 'ファイル名を指定して実行コード' を使用して

回答:7

予想の答え:3

私のコード:コードが変更された

import sys 

def count_substring(search_space, search_string): 
    search_space = search_space.lower() 
    search_string = search_string.lower() 

    if search_space: 
     search_space = search_space.split('\n')[0] 
    if search_string: 
     search_string = search_string.split('\n')[0] 
    lower = 0 
    upper = len(search_string) 
    curr = ' ' 
    count = 0 
    for curr in search_space: 
     selected = search_space[lower:upper] 
     if search_string == selected: 
      count += 1 
     lower += 1 
     upper += 1 
     if upper > len(search_space): 
      break 
    return count 

if __name__ == '__main__': 
    s = sys.stdin.read() 
    t = sys.stdin.read() 
    occurance_count = count_substring(s, t) 
    sys.stdout.write(str(occurance_count)) 

がエラーを解明するのに役立つ:

for idx, curr in enumerate(search_space): 
    print(idx, curr) 
    print(count) 
    selected = search_space[lower:upper] 

Outpu 'デバッグコード' を使用してT:(意図したとおりに機能) 'ファイル名を指定して実行コード' を使用して

>? abababa <ENTER> 
>? aba <ENTER> 
0 a 
0 
1 b 
1 
2 a 
1 
3 b 
2 
4 a 
2 
3 

出力:

abababa 
aba 
^D 
0 a 
0 
1 b 
1 
2 a 
2 
3 b 
3 
4 a 
4 
5 b 
5 
6 a 
6 
7 

注:ファイル名を指定して実行時にEnterキーを押すため は^ DつまりはCtrl + Dを押すと、改行を挿入します。残りのコードを実行するには、Ctrl + Dキーで管理する唯一の方法です。しかし、CTRL + Dがなくても、コードのリモートテストが完了すると、不一致が残ります。(自己ガイド非証明書コースの一部です)

注:この演習では標準入力と出力を使用する必要があります。

for curr in search_space:は、search_spaceの長さに渡ってループが繰り返されるため、それ以上の時間を必要とするようです。

なぜブレイクコマンドは機能しませんか?

私の質問:

  1. ですが、なぜでしょうか?
  2. &このようなイベントを理解し、予見するために、どのコンセプトを読んでいますか?
  3. なぜデバッグモードとランモードの相違がありますか?
  4. 将来のコードでこのエラーを予見し、防止するにはどうすればよいですか?
  5. これを実行するにはCtrl + Dよりも良い方法はありますか?この粗末なトリックは、ターミナルやIDLEでは動作しません。
+0

stdin: 'sys.stdin.read()'から2回読み込みます。このメソッドは、そのストリームから最後まで読み込みます( "run"の例のように、行末ではありません)。それは一度だけ呼び出されるべきであり、後でstdinに触れてはいけません。 –

+0

ありがとうElmar! len(search_string)がゼロだったので何かが間違っていたことに気付きました。 ここではreadline()は良いでしょうか? 私がread()を使用すると、sとtの間の入力をどのように分配するのですか? –

+0

はい、 'readline()'を使うか、後で 'split(" \ n ")' –

答えて

0

コードは、stdinsys.stdin.read()から2回読み取ります。このメソッドは、そのストリームからその最後までを読み込みます( "run"の例のように、行末ではありません)。一度だけ呼び出す必要があります。その後はstdinに触れないでください。

入力を1行ずつ読みたい場合は、sys.stdin.readline()を使用してください。

0

エルマーPeiseのコメント:
をあなたが標準入力から2回読み:sys.stdin.read()。このメソッドは、そのストリームから最後まで読み込みます( "run"の例のように、行末ではありません)。それは一度だけ呼び出されるべきであり、後でstdinに触れてはいけません。

Qubitは書き込みました:
私はread()をreadline()に置き換えました。
誰かがもっと役に立つナゲットを持っていたら、それをしてくれてありがたいですが、私の特定の苦境は今解決されています。
ありがとうElmar!

関連する問題