もっと便利な道具

INPUT · スライド

同じものを1つにする入れ物

01 / 07

重複を消したい、と思ったとき

リストから同じものを取りのぞきたいことがある。アンケートの回答、注文された商品、参加者の名前。

いまの道具でも書ける。空のリストを用意して、まだ入っていないものだけ足していけばいい。

でも「重複を消す」というだけのことに、4行も使っている。

kazus = [3, 1, 3, 2, 1]shurui = []for k in kazus:    if k not in shurui:        shurui.append(k)print(shurui)

実行結果

[3, 1, 2]

02 / 07

set の一言で済む

Python には セットという入れ物がある。いちばんの特徴は、同じ値を2つ持てないこと。

set(...) にリストを渡すと、重複が落ちたセットが返ってくる。さっきの4行が1行になったね。

ここで sorted(...) を通しているのには理由がある。次の次のスライドで話すよ。

kazus = [3, 1, 3, 2, 1]print(sorted(set(kazus)))

実行結果

[1, 2, 3]

03 / 07

中かっこで直接書く

セットは { } の中に値をカンマで並べても作れる。コロンが無い中かっこがセットだよ(コロンがあれば辞書)。

同じ値を2つ書いても、入るのは1つだけ。だから下の iros の中身は2個になる。

  • len(...) … 何個入っているか
  • in … その値があるか

この2つはそのまま使っていい。

iros = {"あか", "あお", "あか"}print(len(iros))print("あか" in iros)print("みどり" in iros)

実行結果

2
True
False

04 / 07

そのまま表示してはいけない

ここがセットのいちばん大事な注意。セットは順番を持っていない。

入れた順も、小さい順も覚えていない。だからそのまま print すると、出てくる順が毎回同じとは限らない。for でそのまま回すのも同じ理由で危ないよ。

中身を見せたいときは、必ず sorted(...) を通して並べてから。sorted はリストを返すので、角かっこ付きで出てくるね。

iros = {"あか", "あお", "きいろ"}print(sorted(iros))

実行結果

['あお', 'あか', 'きいろ']

05 / 07

足す・消す

セットは作ったあとから中身を変えられる。

  • add(値) … 足す。すでにあれば何も起きない
  • discard(値) … 消す。無くてもエラーにならない

リストの append とちがって、add は同じものを2つにしない。「もう入っているかな」と確かめる if が要らないんだ。

iros = {"あか", "あお"}iros.add("きいろ")iros.add("あか")print(len(iros))iros.discard("あお")print(sorted(iros))

実行結果

3
['あか', 'きいろ']

06 / 07

空のセットは set()

ひとつだけ、Python の歴史的な事情でややこしいところがある。

{} は空の辞書であって、空のセットではない。中かっこは先に辞書が使ってしまっていたんだ。

空のセットがほしいときは set() と書く。ここは覚えるしかないところだよ。

print(type({}))print(type(set()))

実行結果

<class 'dict'>
<class 'set'>

07 / 07

セットが得意なこと

ここまでをまとめるとこう。

  • 重複を消す … set(xs)
  • 何種類あるか … len(set(xs))
  • あるか調べる … x in s

並べて見せることは苦手だけれど、「何があるか」だけを知りたいときにめっぽう強い。

次のレッスンでは、2つのセットを重ねてみるよ。「両方にいる人」を探すのに、二重ループを書かなくてよくなる。