LoginSignup
96
96

More than 5 years have passed since last update.

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

Posted at

文字列を要素とする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

96
96
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
96
96