【学問のすすめ】中世ヨーロッパ写字生のように黙って静かに手を動かすブログ

これまで習ったことや学んだことを記事にまとめています。ITネタとChromebookネタが多いです。

【Python】リスト内の一致する文字列の数を数えるコード「match_ends.py」を書いてみた(ソースコードあり)

f:id:pesia_one:20180828010355j:plain:w400

Python3で受け取った文字列のリストから、条件に一致する文字列の数を数えて出力するコードを書いてみました。
開始時点で下記のコードが与えられており、2行目の「# ここになにがしかのコードを入力する」をどうするかを考えます。

def match_ends(li):
# ここに何がしかのコードを入力する

print(match_ends(['aba', 'xyz', 'aa', 'x', 'bbb']))
print(match_ends(['', 'x', 'xy', 'xyx', 'xx']))
print(match_ends(['aaa', 'be', 'abc', 'hello']))

 

はじめに

コードの要件

コードの要件は下記の通りです。

  • 要件1:関数match_endsを書く
  • 要件2:受け取った文字列のリストの要素のうち、2文字以上最初と最後が同じ文字文字列の数を返す

 

入力される文字列と出力される文字列

入力される文字列と、出力させる文字列はそれぞれ下記のとおりです。
今回の文字列は大カッコ[で囲まれたリスト形式で与えられます

  • 入力1:['aba', 'xyz', 'aa', 'x', 'bbb']
  • 入力2:['', 'x', 'xy', 'xyx', 'xx']
  • 入力3:['aaa', 'be', 'abc', 'hello']
  • 出力1:3
  • 出力2:2
  • 出力3:1

 

コード書いてみた

正解のコード

正解のコードは下記です。(Python3.2.5で動作を確認)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def match_ends(li):
    i = 0
    for s1 in li:
        if len(s1) >= 2 and s1[:1] == s1[-1:]:
            i = i + 1
    return i

print(match_ends(['aba', 'xyz', 'aa', 'x', 'bbb']))
print(match_ends(['', 'x', 'xy', 'xyx', 'xx']))
print(match_ends(['aaa', 'be', 'abc', 'hello']))

 

下記URLのGitHubリポジトリにも同じコードを掲載しています。

https://github.com/a1852rw/aiit_001_system_programing/blob/master/lesson_003/003_match_ends.py

 

解説

正解コードの内容について説明します

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

shebang(シバン)と文字コードの指定です。
このコードがPython3で動作すること、文字の出力はUTF-8で行われることを示しています。(ここで文字コードを指定しないと日本語が文字化けします)

def match_ends(li):
    i = 0

関数「match_ends」の最初でループ回数のカウントに使う変数「i」を設定しています。
「i = 0」とすることにより以降で変数「i」が使えるようになります。(この設定をしないとあとでエラーになります)

 

    for s1 in li:

新たな変数「s1」にリスト「li」を代入します。
構文「for ~ in」を使うことによりリスト「li」内の要素が順番に取り出され変数「s1」に代入され、それ以下のコードで変数「s1」が処理されます。

 

        if len(s1) >= 2 and s1[:1] == s1[-1:]:
            i = i + 1

変数「s1」に代入された文字列の文字数が2文字以上でかつ、s1の最初の文字と最後の文字が一致したときだけ処理を行います。
この場合は変数「i」の数値が+1されます

処理が行われた後は「for s1 in li:」まで戻り、リスト「li」から変数「s1」に次の文字列が代入されます。
この動作はリスト「li」内の文字列がなくなるまで繰り返されます

 

   return i

ループが終了した後、ループの回数をカウントした変数「i」が出力されます。

今回は条件に一致する文字列がある場合のみループするよう設定しています。
そのため、ループの回数を数えることでリスト内の該当する文字列の数をカウントすることができます

 

出力は予定通り下記になりました。

3
2
1

 

あとがき

今回はループした回数をカウントする方法を使いました。
この他にリストの中から該当する要素だけを抜き出し、それをもとに新しいリストを生成する技があるようです。
シンプルでわかりやすい方法(可読性の高い書き方)ということでこれを採用しています。
(実はこれ以外のやり方がわかりませんでした、機会があればチャレンジしてみます)