これまで、 整数や実数、 文字列 などの データ型 を紹介してきました。また、複数のデータを順番に登録する リスト と タプル や、データとデータの対応関係を登録する 辞書 も紹介しました。
いろいろなデータ型が出てきて、困ってしまいますね。実のところ、これはまだまだ序の口で、これからももっとたくさん出てきます。
そんなにたくさんの種類があると、それぞれ全部の使い方をいちいち覚えておくのは大変です。そこで、Pythonなど、多くのプログラミング言語では、似たような種類のデータ型をグループとしてまとめ、それぞれのグループは同じような方法で使えるようになっています。これなら、全部の種類のデータ型についていちいち細かいところまで覚えておかなくても、それぞれのグループについて勉強しておくだけでだいたい使えるようになります。
ここでは、そういったグループの中から、コレクション と シーケンス を紹介します。
コレクション¶
数値オブジェクトは、物質の重さや長さなど、いろいろなデータの値を直接あらわすオブジェクトです。一方、 リストや辞書は、直接的なデータではなく、いろいろなデータを登録して、集約しておくために使われるオブジェクトです。
リストやタプル、辞書のように、他のオブジェクトを集約することを目的とした種類のオブジェクトのことを、
コレクション (Collection)
と呼びます。
シーケンス¶
リスト と タプル は、どちらも インデックス(添字) を指定して、登録されている要素を参照できるオブジェクトでした。
次の例は、リストオブジェクト [10, 20, 30, 40, 55]
の、1番目と3番目の要素を参照しています。
values = [10, 20, 30, 40, 55]
print(values[0] + values[2])
タプルオブジェクトでも、全く同じように要素を参照できます。
values = (10, 20, 30, 40, 50)
print(values[0] + values[2])
このように、インデックスを指定して要素を参照できるコレクションのことを、
シーケンス (Sequence)
と呼びます。
リストとタプルは、これまで紹介してきたとおり、インデックスを指定して要素を参照しますので、どちらも シーケンス です。
また、文字列オブジェクト も、インデックスを指定して文字列中の文字を参照できる、シーケンスオブジェクトです。リストやタプルと同じように、[]
にインデックスを指定し、その位置の文字を参照できます。
次の例は、文字列 "HELLO"
の、1番目と3番目の文字を参照しています。
values = "HELLO"
print(values[0] + values[2])
dict_obj = {"dog": "犬", "cat": "猫"}
print("辞書の要素数は:", len(dict_obj))
タプルオブジェクトの要素数は、次のように求められます。
tuple_obj = (1, 2, 3)
print("タプルの要素数は:", len(tuple_obj))
リストオブジェクトの要素数は、次のように求められます。
list_obj = [1, 2, 3, 4]
print("リストの要素数は:", len(list_obj))
文字列オブジェクトの文字数は、次のように求められます。
str_obj = "12345"
print("文字列の長さは:", len(str_obj))
辞書・タプル・リスト・文字列と、どの型のオブジェクトでも、コレクション であれば、同じように len()
関数で要素の数を求められます。
len()
関数については、while文を使ったリストのループ処理 でも紹介していますので参照してください。
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}
print("dict1とdict2は等しいか?", dict1 == dict2)
list1 = [1, 2, 3]
list2 = [1, 2, 4]
print("list1とlist2は等しいか", list1 == list2)
!=
演算子でコレクション同士を比較すると、同じ値のコレクションならFalse
を、異なっていれば True
を返します。
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}
print("dict1とdict2は異なる値か?", dict1 != dict2)
list1 = [1, 2, 3]
list2 = [1, 2, 4]
print("list1とlist2は異なる値か?", list1 != list2)
シーケンスの比較演算子¶
タプルやリスト、文字列などのシーケンスオブジェクトは、 <
、 <=
、>
、>=
などの演算子で、値の大小を判定できます。
list1 = ['a', 'b', 'c']
list2 = ['a', 'b', 'd']
print(list1 <= list2) # list1 < list2 なので True
list3 = ['a', 'b', 'c']
list4 = ['a', 'b', 'b']
print(list3 <= list4) # list3 > list4 なので False
シーケンスではない、辞書オブジェクトなどのコンテナオブジェクトは、 <
などによる大小の比較はできません。比較すると、次のようなエラーとなります。
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}
print(dict1 <= dict2)
シーケンス同士の値の比較は、先頭の要素から順番に同じインデックス同士の値を比較して、先に小さい値となったシーケンスが小さい値となります。
例えば、上記のように (1, 2, 3)
と (1, 2, 4)
を比較した場合、
- 最初の要素の
1
と1
を比較する。同じ値なので、次の値をチェックする。 - 2番めの要素の
2
と2
を比較する。同じ値なので、次の値をチェックする。 - 3番目の要素の
3
と4
を比較する。3
<4
なので、(1, 2, 3)
は(1, 2, 4)
よりも小さい。
のように比較を行います。
比較するシーケンス同士の長さが異なる場合、短いシーケンスの要素と長いシーケンスの要素を比較してすべて等しければ、短い要素のほうが小さい値となります。
たとえば、長さが 3
のタプル (1, 2, 3)
と、長さが 4
のタプル (1, 2, 3, 4)
は、長さ 3
のタプルの要素はすべて長さ 4
のタプルと一致しますので、長さが短い (1, 2, 3)
が小さい値のタプルとなります。
value1 = (1, 2, 3)
value2 = (1, 2, 3, 4)
print(value1 < value2)
list_obj = ["pen", "book", "notebook"]
if "book" in list_obj:
print("list_objにbookが登録されています")
"book" in list_obj
という式は、list_obj
に "book"
という文字列が登録されていれば True
を、登録されていなければ False
を返します。
list_obj = ["pen", "book", "notebook"]
print("book" in list_obj) # list_obj に "book" が含まれているか -> True
print("pencil" in list_obj) # list_obj に "pencil" が含まれているか -> False
タプルオブジェクトも、同様に in
演算子で要素の存在を確認できます。
tuple_obj = [2, 3, 5, 7, 9]
print(5 in tuple_obj) # tuple_obj に 5 が含まれているか -> True
print(11 in tuple_obj) # tuple_obj に 11 が含まれているか -> False
辞書の in 演算子¶
辞書オブジェクトの場合、in
演算子は指定した キー が 登録されているかどうかを調べます。
次の辞書 dict_obj
は、以下のような要素を登録しています。
dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}
キー(英単語) | 値(日本語) |
---|---|
dog | 犬 |
cat | 猫 |
parrot | オウム |
この辞書に cat
という単語が登録されているか調べる場合は、in
演算子を使って次のように記述します。
dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}
if "cat" in dict_obj:
print("catは", dict_obj["cat"], "です")
辞書の in
演算子については、in 演算子 でも紹介していますので参照してください。
文字列の in 演算子¶
文字列オブジェクトの場合も、in
演算子で中に文字が含まれているかどうかを確認できます。
str_obj = "hello world"
print("w" in str_obj) # "w" は str_objに含まれているか -> True
print("a" in str_obj) # "a" は str_objに含まれているか -> False
リストやタプルなど、他の種類のコンテナの場合、in
演算子に値として指定できるのは次のように一つだけです。
3 in [1,2,3,4,5]
しかし、文字列の場合には、1文字だけでなく、一連の文字を指定して検索できます。
例えば、文字列 abracadabra
に cad
という文字列が含まれているかどうか調べる場合は、次のように書けます。
str_obj = "abracadabra"
print("cad" in str_obj) # "cad" は str_obj に含まれているか -> True
print("rad" in str_obj) # "rad" は str_obj に含まれているか -> False
for文¶
コレクションは、for文によるループ で紹介した for
文に指定して、コレクションの要素ごとに、for
文に記述した処理を実行できます。
次の処理は、リストオブジェクトの要素を、upper() メソッド を使って大文字に変換してから出力します。
list_obj = ["apple", "orange", "banana"]
for fruit_name in list_obj:
upper_name = fruit_name.upper()
print(upper_name)
タプルの場合も、同様に for
文を使用できます。
tuple_obj = ("apple", "orange", "banana")
for fruit_name in tuple_obj:
upper_name = fruit_name.upper()
print(upper_name)
文字列を for
文に指定すると、文字列中の文字を一文字づつ取り出します。
str_obj = "hello"
for letter in str_obj:
upper_letter = letter.upper()
print(upper_letter)
この処理では、文字列 str_obj
から文字を1文字ずつ取り出して変数 letter
に代入し、upper()
メソッドを使って大文字に変換してから出力しています。
dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}
for english in dict_obj:
japanese = dict_obj[english]
print(english, "は", japanese, "です")
この処理では、辞書 dict_obj
に登録されている要素のキーを一つづつ取り出して、変数 english
に代入しています。変数 english
の値は、最初の一回目では dog
、2回目は cat
、3回目は parrot
になります。
for
ループ内にある次の処理
japanese = dict_obj[english]
は、取り出されたキー値(変数 english
)を使って dict_obj
からキー値に対応する値を取り出し、変数 japanese
に代入しています。
最後に、変数 english
と japanese
を使って、要素を print()
しています。