やっぱりAIだよね 5

今回は『集合』と『内包表記』なるものについて勉強していこう!

■集合

『集合』とは、文字通り数字が集まってひと塊になっているものを指します。
前回やった数列との違いは、並んでいる順番に意味があるかどうか。
数列のようにある規則性に伴い並んでいるものは、公式を使って数を求めることが出来たりする。一方集合はいってみれが数字がただ集まっているだけ。数列に比べてちょっと緩い感じがする奴らを指します。

集合している数字の一つ一つは『要素』と言い、要素の数は有限個の場合は『有限集合』、偶数!とか奇数!みたいな無限個の集合を『無限集合』と言う。
無限集合の場合は、要素を全部書くわけにはいかないので

{n|n は奇数}
{x|x は実数、0 ≦ x ≦ 1}

みたいに、集合を表すn|nとその右に集合の条件を書く。そしてこの書き方を『内包表記』という。

■Pythonで集合を書く

次の集合をpythonで書いてみる
{x|x は10未満の自然数}

#rangeを使ってリストを作成
>>>a = [x for x in range(1,10)]
>>>print(a)
[1, 2, 3, 4, 5, 6, 7, 8, 9]

この [x for x in range(1,10)] 部分は、まさに集合の内包表記な書き方で{x|x は10未満の自然数}をそのまま書いてますね。リストをこのように内包表記で書くやり方を『リスト内包表記』と言う。

■リスト内包表記の多次元配列

リスト内包表記の書き方で多次元配列のリストを作成することも出来ます。

#リスト内包表記で多次元配列を作成
>>>a = [[0 for i in range(2)] for j in range(4)]
>>>print(a)
[[0, 0], [0, 0], [0, 0], [0, 0]]

同じようなリストを別の書き方で作成することも出来ますが…

#多次元配列を作成
>>>b = [[0] * 2] * 4
>>>print(b)
[[0, 0], [0, 0], [0, 0], [0, 0]]

見た感じは同じですが、リスト内の要素を変更した際に違いが出てしまう。

#多次元配列リストの要素を変更
>>>a = [[0 for i in range(2)] for j in range(4)]
>>>a[1][1] = 5
>>>print(a)
[[0, 0], [0, 5], [0, 0], [0, 0]]

>>>b = [[0] * 2] * 4
>>>b[1][1] = 5
>>>print(b)
[[0, 5], [0, 5], [0, 5], [0, 5]]

b = [[0] * 2] * 4 の書き方だと、一つのリストを更新すると別のリストも更新されてしまうので注意が必要とのこと。気を付けよう。

■集合を扱える『set型』

リストやタプルで集合を作ると順序というルールも一緒についてきますが、冒頭にも触れました集合において数字の順番に特に意味はありません。
そこで、pythonにはset型という便利なやり方が用意されています。
set型を使って集合を作成することで、色々便利なことが出来ます。

#set型で集合を作成
>>>a = set([1,2,3])
>>>b = set([3,4,5])
>>>print(a)
>>>print(b)
{1, 2, 3}
{3, 4, 5}

#積集合(重複する要素を抽出)
>>>print(a & b)
{3}

#差集合(一方にだけある要素を抽出)
>>>print(a - b)
{1, 2}

#和集合(重複する要素をまとめる)
>>>print(a | b)
{1, 2, 3, 4, 5}

set型で集合を作ると面倒な処理を簡単シンプルに処理することが出来ます。

今回はここまで

この記事が気に入ったらサポートをしてみませんか?