もっと便利な道具

INPUT · スライド

2つのセットを重ねる

01 / 07

二重ループで探していたこと

2つの名簿から「両方に載っている人」を探したい。いまの道具でも書ける。

外側で A 組を回して、内側で B 組を回して、同じ名前だったら足す。第2章でやった二重ループだね。

動くけれど、読むのに少し時間がかかる。「何をしたいコードか」が形から見えてこないんだ。

a_kumi = ["ゆい", "はると", "みなと"]b_kumi = ["はると", "そら", "みなと"]ryouhou = []for a in a_kumi:    for b in b_kumi:        if a == b:            ryouhou.append(a)print(ryouhou)

実行結果

['はると', 'みなと']

02 / 07

両方にあるものは & で

セットどうしなら、記号ひとつで書ける。&(アンド)は「両方にあるもの」を集めた新しいセットを返すよ。

7行が1行になった。しかも & という記号が「重なり」を表しているので、何をしたいかが見た瞬間に分かる。

結果もセットなので、表示するときは sorted を忘れずに。

a_kumi = {"ゆい", "はると", "みなと"}b_kumi = {"はると", "そら", "みなと"}print(sorted(a_kumi & b_kumi))

実行結果

['はると', 'みなと']

03 / 07

どちらかにあるものは | で

|(パイプ)は「どちらかにあるもの」を全部集める。両方にあるものは、もちろん1つにまとまるよ。

2つの名簿を合わせて「のべ何人ではなく、実際に何人いるか」を知りたいときに使える。

a_kumi = {"ゆい", "はると", "みなと"}b_kumi = {"はると", "そら", "みなと"}print(sorted(a_kumi | b_kumi))print(len(a_kumi | b_kumi))

実行結果

['そら', 'はると', 'みなと', 'ゆい']
4

04 / 07

片方にしかないものは - で

-(マイナス)は「左にあって、右に無いもの」。引き算と同じ記号だけれど、向きがあるのがポイントだよ。

a - b と b - a は別のものになる。下の例で確かめてみよう。

a_kumi = {"ゆい", "はると", "みなと"}b_kumi = {"はると", "そら", "みなと"}print(sorted(a_kumi - b_kumi))print(sorted(b_kumi - a_kumi))

実行結果

['ゆい']
['そら']

05 / 07

どちらか一方だけは ^ で

^(ハット)は「どちらか一方にだけあるもの」。両方にあるものは落ちるよ。

a - b と b - a を足したもの、と考えると分かりやすい。「片方でしか変わっていないところ」を探すときに使う記号だよ。

a_kumi = {"ゆい", "はると", "みなと"}b_kumi = {"はると", "そら", "みなと"}print(sorted(a_kumi ^ b_kumi))

実行結果

['そら', 'ゆい']

06 / 07

4つを並べて覚える

記号はこの4つだけ。a と b がセットのとき、

  • a & b … 両方にある
  • a | b … どちらかにある
  • a - b … a にあって b に無い
  • a ^ b … どちらか一方だけにある

どれも新しいセットを返す。a や b の中身は変わらないので、続けて何度でも使えるよ。

a = {1, 2, 3}b = {2, 3, 4}print(sorted(a & b))print(sorted(a | b))print(sorted(a - b))print(sorted(a ^ b))

実行結果

[2, 3]
[1, 2, 3, 4]
[1]
[1, 4]

07 / 07

買い物に使ってみる

「買うものリスト」から「もう家にあるもの」を引けば、本当に買うものだけが残る。

こういう「差」や「重なり」の計算は、プログラムを書いているとおどろくほどよく出てくる。リストでやろうとすると二重ループ、セットなら記号ひとつだよ。

次のレッスンからは「数える・まとめる」道具に移ろう。

kaimono = {"たまご", "ぎゅうにゅう", "パン"}reizouko = {"ぎゅうにゅう", "バター"}print(sorted(kaimono - reizouko))

実行結果

['たまご', 'パン']