読者です 読者をやめる 読者になる 読者になる

Python Works

Pythonで色々プログラミングする

Python入門 - シーケンス セット マッピング (1)

複数のオブジェクトを集めたデータ型

データには、複数のオブジェクトが集まったものがあります。例えば、数値は、それ自体で1つのオブジェクトです。しかし、文字列は複数の「文字」というオブジェクトが「順番」に並んでできたオブジェクトと言えます。文字列のように、複数のオブジェクトを扱うためのデータ型がPythonには、たくさん用意されています。

これは、Pythonのおおきな特養の一つです。

 

記事が長くなってしまうため、ここでは内容の解説だけにして、文法やサンプルコードは別の記事にしたいと思います。

 

それでは、順番に見ていきましょう。

 

シーケンス(順序型)

シーケンスは順序のあるオブジェクト(要素)の集まりです。シーケンスには1度生成すると変更できない不変(イミュータブル immutable)なものと、後からでも変更できる可変(ミュータブル mutable)なものがあります。シーケンスは順序があるため、個々の要素の値が一緒でも、順序が違うと別オブジェクト扱いです。

 

不変(イミュータブル)

不変なシーケンスは3種類あります。

  • string (文字列)
  • tuple (タブル)
  • bytes

 

可変(ミュータブル)

可変なシーケンスは2種類です。

  • list (リスト)
  • bytearray

 

それでは、それぞれについて説明していきたいと思います。

 

string (文字列)

Unicodeの文字列です。それぞれの「1文字」はU+0000 - U+10FFFFで表現されます。文字列を、それぞれの文字を0 - 10FFFF(16進数)に変換したり、「文字列」を、その数値データが並んだ「bytes」に変換したり、逆に「bytes」を「文字列」に変換したりできます。

ちなみに、Pythonには、いわゆる「char」型はありません。

 

tuple (タブル)

タプルは、複数のデータを1つにまとめたものです。タプルにできるデータの種類や数は任意です。いくつかのデータを、とても気軽にグループにまとめることができます。

タプルは不変なデータ型のため、一度作ると、後から変更することはできません。

変更しないデータを扱うのに向いています。

 

list (リスト)

リストは、いくつかのデータを順番に並べたものです。リストを構成するデータ(リストの要素)は、タプルと一緒で、種類や数は自由です。

タプルとの違いは、後から変更できることです。つまり、要素を追加したり、削除したり、並び替えたりできます(シーケンスは順序に意味があるため、要素が同じでも順序が違うと別のオブジェクトです)。

 

bytesとbytearray

bytesとbytearrayは、どちらもバイトデータが順番に並んだもの(シーケンス)です。基本的な機能や、その機能の使い方(インターフェース)は一緒です。違うのは、もちろん変更できるかできないかです。

変更できないbytesにはハッシュの機能があり、bytearrayは要素の変更や追加削除ができます。

 

セット (集合型)

セットタイプは、重複を許さない要素の集まりです。すでにセットに含まれているオブジェクトを、別にもう1つ追加しようとしても追加できない、ということです。また、要素の順番も関係ありません。

すでにシーケンスがあるのに、なぜセットが必要なのかわかりにくいかもしれませんので、セットの主な用途を並べておきまs。

  • オブジェクトが、ある条件を満たしたものの集まりに属しているかどうかを高速に調べる(絶対に重複がないので、高速に調べられる)
  • シーケンスから、重複した要素をなくす。
  • 和集合や積集合といった、数学的な集合の計算をする
  • この後で説明するmap (辞書型)のキーにする

 

セットには、可変なものと不変なものが、それぞれ1つずつ用意されています。

  • set (セット 可変)
  • frozen set (フローズンセット不変)

setとfrosen setの違いは、bytesとbytearrayと同じです。基本的な機能は共通ですが、setは要素の追加や削除ができ、frosen setはハッシュを利用することができます。

 

マッピング

マッピングは「インデックス」のセットと、「インデックスに対応するオプジェクト」の組が要素として集まったものです。

マッピングは、なかなかピンとこないと思います。そこで、具体例として辞書を考えてみるとわかりやすいと思います。辞書は、「見出し語」と「見出し語の説明」の組が要素となって構成されています。「見出し語」が「インデックス」で「見出し語の説明文」が「インデックスに対応するオブジェクト」です。辞書では、「見出し語」は重複しません。もし同じ見出し語が2つあったら、どちらを見たらいいかわからなくなってしまうからです。また、「見出し語」は、比較的短いため、「見出し語一覧」から検索するのも簡単です。

この「辞書」のような構造のモデルをプログラムのデータ型にしたのが「マッピング」というわけです。

Pythonには、もともと組み込まれているマッピングは1つしかありません。その名もズバリ、

  • dictionary (辞書型)

です。

dictionaryは可変であり、インデックスのことを「キー」と呼びます。

「キー」は、先ほど説明した通り、「セット」でなければなりません(重複があると困るからです)。

一部のデータ型は、この「キー」にすることができません。「キー」にすることができたにデータ型は以下の通りです。

  • list
  • dictionary
  • オブジェクトが一致するかどうかを比較するときに、オブジェクトの同一性でなく値で比較するもの

最後のは、よくわからなければ「ふーん、そんな条件があるんだ」くらいに思っておいていただければいいと思います。