いろんなまとめ

IT技術系のことを気が向くままに書いていきます。勉強会の感想とか

Pythonで2つの文字列から共通の文字を見つける

最近Pythonの学習に使っているCheckioで面白い問題があったので、記事にしてみます。

Checkioについてはこちら

py.CheckiO - Python coding challenges and exercises with solutions for beginners and advanced

そして、問題は「Common Words」

問題の仕様は以下の通り

入力:二つの文字列(単語の区切りは「,」)

出力:共通する単語を文字列として出力(単語の区切りは「,」)

私の作った回答はこちら

 def func(arg1, arg2):
    li1 = arg1.split(',')
    li2 = arg2.split(',')
    ret = []
    for i in li1:
        if i in li2:
            ret.append(i)
    ret_val = ",".join(sorted(ret))
    return ret_val


print(func("one,two,three", "four,five,one,two,six,three"))

 ええと、なんとまぁ、手続き型の書き方なんでしょう。。。

回答としては正解していたのですが、なんとも不格好というか、ダサいというか、Pythonらしくないというか。。。

Checkioでは、問題に回答し、正解すると他の回答者の回答が見れるので、それを見て自分のコードを振り返ります。

一番いいなと思った回答はこちら

def func(first, second):
    return ','.join(sorted(set(first.split(',')) & set(second.split(','))))

 

気になったのは2つの引数の文字列から共通の文字列を探すはずなのに、if文がないこと。

ここで、このコードのポイントは2つあると考えました。

1.setオブジェクト
2.join関数の中の「&」

一つ目のsetオブジェクトについては、以下の部分が該当箇所かと。

sorted(set(first.split(','))

ここで文字列をカンマ区切りで配列に変換。

配列をsetオブジェクトに変換。
そしてアルファベット順に並び替え。
setオブジェクトについては、Pythonの公式ドキュメントを参照すると、「重複のない要素の順序なしコレクション」とのこと。

二つ目のjoin関数の中の「&」については、同じく公式ドキュメントを参照。
そこでは「s & t」は「集合s と 集合tで共通する新しい集合 」とのこと。

 

なるほど。if文なく共通する文字列を探している部分はここだったのか。
最終的に演算後の集合をカンマ区切りで文字列を作成し、関数の結果とし返す、と。

まだまだ頭が固いなーと思った問題でした。