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文なく共通する文字列を探している部分はここだったのか。
最終的に演算後の集合をカンマ区切りで文字列を作成し、関数の結果とし返す、と。
まだまだ頭が固いなーと思った問題でした。