Python 集合型 使い方

Python学習【365日チャレンジ!】28日目のマスターU(@Udemy11)です。

突然ですが、食べることってほんと楽しいですし、嬉しくなっちゃいませんか?

我が家では長い間、自家製【カスピ海ヨーグルト】を作っています。

カスピ海ヨーグルト

作り方はかんたんで、種となるカスピ海ヨーグルト50cc位を1リットルの牛乳に入れて混ぜたあと、常温の室内に24時間程度放置するだけ。

市販されているカスピ海ヨーグルトやカスピ海ヨーグルトの種を使っても始められます。

そのカスピ海ヨーグルトに、バナナとはちみつを入れて食べるとめっちゃ美味しいんですよね〜!

ほんとどんどん太っちゃいます。

ということで、本日も【Python学習】いってみましょう!

昨日の復習

昨日は、集合型のメソッドを学習しました。

次のような代表的なメソッドがありましたね。

add()

集合型に値を付け加えますが、すでに存在している値は新たに付け加えられません。

>>> a = {1, 2, 4, 5, 6}
>>> a.add(3)
>>> a
{1, 2, 3, 4, 5, 6}

remove()

リスト型でも使われるremoveは、値を取り除きます。
pop()も使えますが、リスト型が最後の値を取り出すのに対して、集合型は最初の値を取り出します。

>>> a = {1, 2, 3, 4, 5, 6}
>>> a.remove(6)
>>> a
{1, 2, 3, 4, 5}
>>> a.pop()
1
>>> a
{2, 3, 4, 5}

removeが値を指定するのに対して、popは指定する必要がありません。

difference()

differenceはマイナスの演算記号と同じ結果が得られました。

>>> a = {1, 2, 6}
>>> b = {2, 3, 4, 5}
>>> a - b
{1, 6}
>>> a.difference(b)
{1, 6}
>>> b - a
{3, 4, 5}
>>> b.difference(a)
{3, 4, 5}

-を使ったほうがわかりやすい気がするのはわたしだけ?

intersection()

intersectionは、&(アンパサンド)と同じ結果が得られます。

>>> a = {1, 2, 3, 4}
>>> b = {2, 3, 4, 6}
>>> a & b
{2, 3, 4}
>>> a.intersection(b)
{2, 3, 4}

intersectionは、aかつbを求めるので、aとbを反対にしても結果は同じです。

clear()

clearはその名のとおり、データをクリアーにしてくれます。

>>> a = {1, 2, 3, 4}
>>> a.clear()
set()
>>> b = {'x': 10, 'y': 20, 'z': 30}
>>> b.clear()
{}

集合型と同じように辞書型もBracesの波括弧を使っているので、集合型の中身を空にするとset()が返されます。
一方、リスト型は、{}波括弧だけが返されます。

他のメソッドはhelp(set)で確認することができるので、気になったらいろいろと試してみてください。

それでは、本日の集合型の使いどころに入っていきましょう!

共通の友人を探す

集合型は、2つの集合の中から共通の値をかんたんに見つけることができるので、例えばFacebookのように、共通の友人を表示するという使い方ができます。

my_friends = {'A', 'B', 'C'}
a_friends = {'C', 'D', 'E'}
print(my_friends & a_friends)

出力結果

{C}

これまではせいぜい5個程度の数の値しか処理していないので、あまり具体的な使い方のイメージはできませんが、ここまでかんたんじゃないにせよ、このような処理が実際にFacebookとかで動いていると思うと、ちょっと興奮しちゃいます。

もちろん、もっと複雑な処理がされているわけですが、プログラムを紐解いていくと、このような基本的な処理がもとになっているので、しっかりと基礎基本を学んでおくのは重要です。

買い物リストから種類を抽出する

購入した果物の種類をどんどんリストに入れていって、含まれている種類を抽出するという使い方ができます。

f = []
f.append('apple')
f.append('orange')
f.append('orange')
f.append('orange')
f.append('banana')
f.append('apple')
print(f)
 
kind = set(f)
print(kind)

出力結果

['apple', 'orange', 'orange', 'orange', 'banana', 'apple']
{'apple', 'orange', 'banana'}

リストの値はどんどん積み上がっていくので、その中から同じ種類は一つにして、どんな種類が入っているのか抽出する使い方ができます。

10個以内のデータなら、見た目でもすぐにわかりますが、これが1000、10000になってくると数えてられませんので、一瞬で同じ値を集めてくれるのは非常に便利です。

普段使っているエクセルなどにも同じ値を集める関数がありますよね。

リスト型・タプル型・辞書型・集合型の変換

上の例では、set()を使って、リスト型を集合型に変換していましたが、それぞれの型変換ってできるのか試してみました。

x = {'x': 10, 'y': 20, 'z': 30}
a = {1, 3, 4, 5, 7}
b = list(a)
c = tuple(a)
d = set(b)
e = set(c)
f = list(c)
g = tuple(b)
h = list(x)
i = tuple(x)
j = set(x)
 
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
print(h)
print(i)
print(j)

出力結果

{1, 3, 4, 5, 7}
[1, 3, 4, 5, 7]
(1, 3, 4, 5, 7)
{1, 3, 4, 5, 7}
{1, 3, 4, 5, 7}
[1, 3, 4, 5, 7]
(1, 3, 4, 5, 7)
['x', 'y', 'z']
('x', 'y', 'z')
{'y', 'z', 'x'}

リスト・タプル・集合の3つは、お互いに変換したりされたりできるみたいです。

辞書型はkeyとvalueの2つの値を持っているので、リスト型やタプル型、集合型に変換するとkeyが抽出されるようです。

逆に、1つの値だけで構成されているリスト型などから、辞書型には変換できず、エラーが起こりました。

ネットで調べると同じ数のインデックスを持ったリストをzip()を使ってリスト型を使って、辞書型に変換できることがわかりました。

a = ['x', 'y', 'z']
b = [10, 20, 30]
d = dict(zip(a, b))
print(d)

出力結果

{'x': 10, 'y': 20, 'z': 30}

ネットで調べるとたいがいのことはわかるので、疑問に思ったことはほっておかないで、ネットで調べる癖をつけましょう!

遊びごころが大切

Python 遊び心

講座の中では、今日やったようなしょうもないこと!?は入っていません。

ある意味、当たり前過ぎて講座に入れる必要もないのか、気になったら試してみたらいいんじゃないのということなのかはわかりませんが、わたしが講座を作るにしても、多分取り入れないかもしれません。

でも、このような一見あほらしいことを試してみることが基礎基本を身につけるために大切な遊び心じゃないかと思います。

実際、コードを打ちながら、エラーが起こらずに結果が表示されると

じゃあ、これはどうかな?

なんて思いながら、いろいろと試したくなってくるんですよね。

そうこうしていると知らない間に時間が経っているんです。

いわゆる没頭って状態ですね。

この没頭するって状態がなにかを習得するためには必要ですが、自分自身が楽しまないと決して没頭することはできません。

湧き出す好奇心にしたがって、遊び心をもってチャレンジしてみてください。

それでは明日も、Good Python!