Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

「文字列の先頭文字列がスライスで取り出せません」スライスでありがちなミスの解決法を紹介します

f:id:kenken0326:20191030155406p:plain

こんにちはPyQサポートです。
今回は、「スライスを使い、先頭文字列を取り出したいのですが、なぜ実行されないのでしょうか?」という質問の解決法を紹介します。

質問

文字列の先頭文字列の検索に対しての質問です。 スライスを使い、答えを取り出したいのですが、なぜ下記の書き方だと実行されないのですか?

def main():
    """メインの処理."""
    with open('input/reservation.csv', encoding = 'utf-8')as f:
        for row in f:
            if '高橋' == row[:1]:
                print(row.rstrip())


if __name__ == '__main__':
    main()

回答

思い通りに動かない場合は、動かなくなった箇所からさかのぼって原因を探しましょう。 今回は何も表示されない状態なので、表示を行う箇所( print(row.rstrip()) )から確認します。

動かない箇所から遡って原因を特定する考え方

  1. 何も表示されていない
  2. 表示を行う箇所であるprint(row.rstrip()) が実行されていない
  3. 直前のif文'高橋' == row[:1]がTrueになっていない
  4. rowが「高橋」で始まっている場合も、Trueになっていない
  5. row[:1] はrowが「高橋」から始まっている場合、どんな文字列になっているのだろうか?
  6. 毎回の row[:1] はなにか確認しよう

上記の手順にしたがって原因を調査する為、if文のひとつ上の行に print(row[:1]) と記述して実行しましょう。これにより、for文のループごとに row[:1] がどんな文字列を表しているか確認することができます。

for row in f:
    print(row[:1])  # ←追加
    if '高橋' == row[:1]:
        print(row.rstrip())

出力結果

山
鈴
佐
清
加
山
鈴
高
山
鈴

row[:1]: だと、最初から1文字目までしか抽出できていませんね。

'高橋' == row[:1]がTrueになるには、最初から2文字を抽出する必要があります。文字列の最初から2文字まで抽出できるように正しいコードに変えましょう。

if '高橋' == row[:2]:

まとめ

プログラムが思った通りに動かない時には、コードのどこかに誤りがあるはずです。そんな時は、動かなくなった箇所から遡って、原因を調べてみましょう。

Copyright ©2017- BeProud Inc. All rights reserved.