文字列を要素とする2つのリストを比較して、共通する要素をリストとして取り出したいことがありました。
まあ、出来るんですが、どうやるのが良いのかなと自分なりにアレコレ考えたり調べたりしました。
###たとえば、
こんな、tag_listとsrc_listという2つのリストがあって、共通する要素をリストとして取り出したいとします。
tag_list=['igarashi', 'kubo', 'iguchi']
src_list=['taniguchi', 'matsushita', 'koyama', 'asama',
'marui', 'igarashi', 'kubo', 'kondo']
tag_listは3つの要素があります。
igarashi
とkubo
はsrc_listにもありますが、iguchi
はないので期待値は['igarashi', 'kubo']
となります。
###1. それぞれのリストをfor文で回して要素を取り出し比較する
matched_list = []
for tag in tag_list:
for src in src_list:
if tag == src:
matched_list.append(tag)
私の頭で最初に思いついたのは、当然コレでした。
分かりやすいんですけど、インデントが深くてもっさりした感じだなあと…
###2. 1つのリストはfor文、もう1つはfilter関数で要素を取り出して比較する
matched_list = []
for tag in tag_list:
matched_list+=filter(lambda str: str == tag, src_list)
リスト操作関数、filter(), map(), reduce()あたりを使ってみたくて、頑張ってみました。配列操作関数が充実してる言語に慣れた今風な方には直感的なんでしょうか?
###3. リストを集合型(set)に変換して論理積をとる。その結果をリストに変換する
src_set = set(src_list)
tag_set = set(tag_list)
matched_list = list(src_set & tag_set)
ググったらこんなのがいきなり出てきました。ある意味直感的です。
集合型は順序を持たないってのがポイントでしょうか?こういうときに使えるんだなと勉強になりました。
で結局、どう書くのが一番良いんだろう?
わかりやすさ、可読性、スッキリさ、pythonぽさと、一長一短あってどれでも良いのかな?と私は思いました。
もっと他にもギョギョギョ!って書き方あるんですかね?
あと、処理速度的には差が出るのかな?というのも気になりました。
今度、大きなサンプルデータ作って測ってみようと思います。
###サンプルソース
cmp_list.py
https://github.com/yamao2253/qiita