数弱の文系大学生によるブログです。

Python、Webデザイン関連の記事を投稿していけたらなと思っています。

備忘録的なブログなので、読みにくい文章だと思います。ご了承ください。

Python3の復習(辞書・集合)

こんにちは。

最近乃木坂46バナナマンに大ハマりしている、かにたまごです。
中学生のときAKB48SKE48NMB48にハマって以来、秋元康系列のグループとは疎遠でしたが
バナナマンのコントめちゃくちゃ面白ぇ!→バナナマン司会のバラエティー番組観てみる
→乃木坂ってどこ?に行き着く→高山一実って子可愛いな→あ。全員可愛いな
ってな感じで、どんどん沼にはまっていきました。
入りが歌ではなくバラエティー番組ってところ、中学生の時と同じです。


それはさておき、今回は

  • 辞書
  • 集合

について、サラッと復習していきます。


今までのPython3 復習履歴は以下の通り。

  1. 数値・文字列
  2. リスト・タプル

辞書

データを一意のキーで管理するデータ構造。
他の言語では連想配列やハッシュ、ハッシュマップなどと呼ばれている。

  • 辞書の作成

波括弧で作成するのが一番簡単そう。

>>>emp_dic = {}
>>>emp_dic
{}
>>>nogi = {
    "秋元真夏":"1期生",
    "生田絵梨花":"1期生",
    "井上小百合":"1期生",
    "衛藤美彩":"1期生",
    "齋藤飛鳥":"1期生",
    "斉藤優里":"1期生",
    "桜井玲香":"1期生",
    "白石麻衣":"1期生",
    "高山一実":"1期生",
    "中田花奈":"1期生",
    "西野七瀬":"1期生",
    "樋口日奈":"1期生",
    "星野みなみ":"1期生",
    "松村沙友里":"1期生",
    "和田まあや":"1期生"
}
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生'}

ハマってるものを例にしちゃう癖が・・・。
まぁいいか。


dict関数を使用すると、二つの値のシーケンスを辞書に変換することができる。その場合、先頭要素がキー、その次の要素が値になる。

>>>introduce = [["name","Kanitamago"], ["age", 22], ["gender", "male"]]
>>>i_dict = dict(introduce)
>>>i_dict
{'name': 'Kanitamago', 'age': 22, 'gender': 'male'}
  • 値の追加・変更・削除

キーを利用して値の追加や変更を行う。
対象とする辞書内にキーが存在する場合は、そのキーと対応する値を変更する。存在しない場合は、そのキーと値が新たに辞書に追加される。

>>>nogi["伊藤かりん"] = "1期生"
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '1期生'}
>>>nogi["伊藤かりん"] = "2期生"
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '2期生'}


updateメソッドで辞書の結合ができる。
対象辞書を直接書き換えるので、戻り値はなし。

>>>nogi2 = {
    "伊藤純奈":"2期生",
    "北野日奈子":"2期生",
    "佐々木琴子":"2期生",
    "新内眞衣":"2期生",
    "鈴木絢音":"2期生",
    "寺田蘭世":"2期生",
    "堀未央奈":"2期生",
    "山崎怜奈":"2期生",
    "渡辺みり愛":"2期生",
    "大橋彩香":"2期生"
}
>>>nogi2
{'伊藤純奈': '2期生', '北野日奈子': '2期生', '佐々木琴子': '2期生', '新内眞衣': '2期生', '鈴木絢音': '2期生', '寺田蘭世': '2期生', '堀未央奈': '2期生', '山崎怜奈': '2期生', '渡辺みり愛': '2期生', "大橋彩香":"2期生"}
>>>nogi.update(nogi2)
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '1期生', '伊藤純奈': '2期生', '北野日奈子': '2期生', '佐々木琴子': '2期生', '新内眞衣': '2期生', '鈴木絢音': '2期生', '寺田蘭世': '2期生', '堀未央奈': '2期生', '山崎怜奈': '2期生', '渡辺みり愛': '2期生', "大橋彩香":"2期生"}


del文で指定したキーの値を削除できる。

>>>del nogi["大橋彩香"]
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '1期生', '伊藤純奈': '2期生', '北野日奈子': '2期生', '佐々木琴子': '2期生', '新内眞衣': '2期生', '鈴木絢音': '2期生', '寺田蘭世': '2期生', '堀未央奈': '2期生', '山崎怜奈': '2期生', '渡辺みり愛': '2期生'}


clearメソッドですべての要素を削除。

>>>nogi.clear()
>>>nogi
{}
  • キー・要素の取得

まず一つは、前に見た通りキーによる要素の取得。

>>>nogi["秋元真夏"]
"1期生"

キーが存在しないとエラーが発生する。

>>>nogi["久保史緒里"]
Traceback (most recent call last):
File "C:\Users\***\Desktop\Python\Test\blog_test.py", line 1, in <module>
KeyError: '久保史緒里'

エラーを発生させないためには

  • in でキーチェック
  • getメソッドによるチェック

が必要。

>>> "久保史緒里" in nogi
False
>>>nogi.get("久保史緒里", "登録されていません")
登録されていません
#オプションが指定されていない場合、Noneが返る


keysメソッドによる全キーの取得。

>>>nogi.keys()
dict_keys(['秋元真夏', '生田絵梨花', '井上小百合', '衛藤美彩', '齋藤飛鳥', '斉藤優里', '桜井玲香', '白石麻衣', '高山一実', '中田花奈', '西野七瀬', '樋口日奈', '星野みなみ', '松村沙友里', '和田まあや', '伊藤かりん', '伊藤純奈', '北野日奈子', '佐々木琴子', '新内眞衣', '鈴木絢音', '寺田蘭世', '堀未央奈', '山崎怜奈', '渡辺みり愛'])


valuesメソッドによる全要素の取得。

>>>nogi.values()
dict_values(['1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '1期生', '2期生', '2期生', '2期生', '2期生', '2期生', '2期生', '2期生', '2期生', '2期生'])


itemsメソッドによる全ペアの取得。
キーと要素がタプルとしてまとめられる。

>>>nogi.values()
dict_items([('秋元真夏', '1期生'), ('生田絵梨花', '1期生'), ('井上小百合', '1期生'), ('衛藤美彩', '1期生'), ('齋藤飛鳥', '1期生'), ('斉藤優里', '1期生'), ('桜井玲香', '1期生'), ('白石麻衣', '1期生'), ('高山一実', '1期生'), ('中田花奈', '1期生'), ('西野七瀬', '1期生'), ('樋口日奈', '1期生'), ('星野みなみ', '1期生'), ('松村沙友里', '1期生'), ('和田まあや', '1期生'), ('伊藤かりん', '1期生'), ('伊藤純奈', '2期生'), ('北野日奈子', '2期生'), ('佐々木琴子', '2期生'), ('新内眞衣', '2期生'), ('鈴木絢音', '2期生'), ('寺田蘭世', '2期生'), ('堀未央奈', '2期生'), ('山崎怜奈', '2期生'), ('渡辺みり愛', '2期生')])


辞書は参照型なので、参照しているアドレス先は一緒。
変更による影響を与えたくない場合は、copyメソッドを用いる。

>>>nogi_copy = nogi.copy()
>>>nogi_copy
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '1期生', '伊藤純奈': '2期生', '北野日奈子': '2期生', '佐々木琴子': '2期生', '新内眞衣': '2期生', '鈴木絢音': '2期生', '寺田蘭世': '2期生', '堀未央奈': '2期生', '山崎怜奈': '2期生', '渡辺みり愛': '2期生'}

集合

重複のないデータ集合(ユニークなデータ)を扱うことができる。

  • 集合の作成

set関数を使用するか、波括弧とカンマを使用して作成する。

>>>emp_set = set()
>>>emp_set
set()
>>>test_set = {1, 2, 2, 4, 3, 4}
>>>test_set
{1, 2, 3, 4}
  • 集合の演算

積集合 -> 両方の集合に共通する部分を取得する。

>>>nogi = set(nogi)
>>>nogi
{'伊藤かりん', '堀未央奈', '新内眞衣', '衛藤美彩', '樋口日奈', '寺田蘭世', '齋藤飛鳥', '渡辺みり愛', '井上小百合', '斉藤優里', '星野みなみ', '中田花奈', '北野日奈子', '生田絵梨花', '松村沙友里', '伊藤純奈', '秋元真夏', '和田まあや', '佐々木琴子', '白石麻衣', '桜井玲香', '高山一実', '鈴木絢音', '西野七瀬', '山崎怜奈'}
>>>from_chiba = set(["木村拓哉", "マツコ・デラックス", "小島瑠璃子", "藤木直人", "前田敦子", "星野みなみ", "高山一実"])
>>>from_chiba
{'前田敦子', '星野みなみ', '藤木直人', 'マツコ・デラックス', '高山一実', '木村拓哉', '小島瑠璃子'}
>>>nogi
{'秋元真夏': '1期生', '生田絵梨花': '1期生', '井上小百合': '1期生', '衛藤美彩': '1期生', '齋藤飛鳥': '1期生', '斉藤優里': '1期生', '桜井玲香': '1期生', '白石麻衣': '1期生', '高山一実': '1期生', '中田花奈': '1期生', '西野七瀬': '1期生', '樋口日奈': '1期生', '星野みなみ': '1期生', '松村沙友里': '1期生', '和田まあや': '1期生', '伊藤かりん': '1期生', '伊藤純奈': '2期生', '北野日奈子': '2期生', '佐々木琴子': '2期生', '新内眞衣': '2期生', '鈴木絢音': '2期生', '寺田蘭世': '2期生', '堀未央奈': '2期生', '山崎怜奈': '2期生', '渡辺みり愛': '2期生'}
>>>from_chiba.intersection(nogi)
{'高山一実', '星野みなみ'}


和集合 -> 少なくともどちらかの集合に含まれている部分を取得する。

>>>from_chiba.union(nogi)
{'秋元真夏', '松村沙友里', '木村拓哉', '斉藤優里', '桜井玲香', '西野七瀬', '藤木直人', '井上小百合', '伊藤かりん', '寺田蘭世', '伊藤純奈', 'マツコ・デラックス', '小島瑠璃子', '山崎怜奈', '北野日奈子', '佐々木琴子', '堀未央奈', '新内眞衣', '前田敦子', '齋藤飛鳥', '衛藤美彩', '白石麻衣', '高山一実', '樋口日奈', '鈴木絢音', '生田絵梨花', '中田花奈', '和田まあや', '星野みなみ', '渡辺みり愛'}


差集合 -> 第一集合には含まれているが、第二集合には含まれていない集合(共通部分も除く)を取得する。

>>>from_chiba.difference(nogi)
{'前田敦子', 'マツコ・デラックス', '小島瑠璃子', '木村拓哉', '藤木直人'}


排他的OR -> 共通部分以外の集合を取得する。

>>>from_chiba.symmetric_difference(nogi)
{'衛藤美彩', '堀未央奈', '井上小百合', '齋藤飛鳥', '西野七瀬', '白石麻衣', '生田絵梨花', '和田まあや', '樋口日奈', '寺田蘭世', '伊藤かりん', '山崎怜奈', 'マツコ・デラックス', '佐々木琴子', '松村沙友里', '藤木直人', '木村拓哉', '渡辺みり愛', '中田花奈', '鈴木絢音', '前田敦子', '北野日奈子', '斉藤優里', '伊藤純奈', '桜井玲香', '小島瑠璃子', '秋元真夏', '新内眞衣'}


issubsetメソッドで、第一集合が第二集合の部分集合になっているかどうかをチェックできる。

#subsetはnogiの部分集合である
>>>subset = from_chiba.intersection(nogi)
>>>subset
{'星野みなみ', '高山一実'}
>>>subset.issubset(nogi)
True


issupersetメソッドで、第一集合が第二集合の上位集合になっているかどうかをチェックできる。

#nogiはsubsetの上位集合である
>>>nogi.issubset(subset)
True

最後はかなり駆け足になってしまいましたが、一通り振り返ってみました。
特に辞書はリストと同じくらいよく使うので、今回復習した部分くらいはススッと思い出せるようにしたいなぁ。


以上です。