Help us understand the problem. What is going on with this article?

リストとリストを比較して、共通する要素をリストで取り出す方法

More than 5 years have passed since last update.

文字列を要素とする2つのリストを比較して、共通する要素をリストとして取り出したいことがありました。
まあ、出来るんですが、どうやるのが良いのかなと自分なりにアレコレ考えたり調べたりしました。

たとえば、

こんな、tag_listとsrc_listという2つのリストがあって、共通する要素をリストとして取り出したいとします。

tag_list=['igarashi', 'kubo', 'iguchi']
src_list=['taniguchi', 'matsushita', 'koyama', 'asama', 
          'marui', 'igarashi', 'kubo', 'kondo']

tag_listは3つの要素があります。
igarashikuboは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

yamao2253
普段はハードウェア開発のお仕事をしています。Webアプリなど今風の技術に興味があって、趣味で取り組んでいますが、なかなか難しくて…(^_^;)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away