ゼロからのPython入門講座タプルとコレクション コレクションとシーケンスの基礎

タプルコレクションとシーケンスの基礎コレクションのアンパック代入

これまで、 整数や実数文字列 などの データ型 を紹介してきました。また、複数のデータを順番に登録する リストタプル や、データとデータの対応関係を登録する 辞書 も紹介しました。

いろいろなデータ型が出てきて、困ってしまいますね。実のところ、これはまだまだ序の口で、これからももっとたくさん出てきます。

そんなにたくさんの種類があると、それぞれ全部の使い方をいちいち覚えておくのは大変です。そこで、Pythonなど、多くのプログラミング言語では、似たような種類のデータ型をグループとしてまとめ、それぞれのグループは同じような方法で使えるようになっています。これなら、全部の種類のデータ型についていちいち細かいところまで覚えておかなくても、それぞれのグループについて勉強しておくだけでだいたい使えるようになります。

ここでは、そういったグループの中から、コレクションシーケンス を紹介します。

コレクション

数値オブジェクトは、物質の重さや長さなど、いろいろなデータの値を直接あらわすオブジェクトです。一方、 リストや辞書は、直接的なデータではなく、いろいろなデータを登録して、集約しておくために使われるオブジェクトです。

リストやタプル、辞書のように、他のオブジェクトを集約することを目的とした種類のオブジェクトのことを、

コレクション (Collection)

と呼びます。

シーケンス

リストタプル は、どちらも インデックス(添字) を指定して、登録されている要素を参照できるオブジェクトでした。

次の例は、リストオブジェクト [10, 20, 30, 40, 55] の、1番目と3番目の要素を参照しています。

In [20]:
values = [10, 20, 30, 40, 55]
print(values[0] + values[2])
40

タプルオブジェクトでも、全く同じように要素を参照できます。

In [21]:
values = (10, 20, 30, 40, 50)
print(values[0] + values[2])
40

このように、インデックスを指定して要素を参照できるコレクションのことを、

シーケンス (Collection)

と呼びます。

リストとタプルは、これまで紹介してきたとおり、インデックスを指定して要素を参照しますので、どちらも シーケンス です。

また、文字列オブジェクト も、インデックスを指定して文字列内の文字を参照できる、シーケンスオブジェクトです。リストやタプルと同じように、[] に指定したインデックスの文字を参照できます。

次の例は、文字列 "HELLO" の、1番目と3番目の文字を参照しています。

In [22]:
values = "HELLO"
print(values[0] + values[2])
HL

コレクションの操作

コレクションに属するオブジェクトは、どれも同じように使える、共通の処理が用意されています。以下で、その一部を紹介します。

コレクションの要素数

コレクションに登録されている要素の数は、len() 関数で調べられます。

辞書オブジェクトの要素数は、次のように求められます。

In [16]:
dict_obj = {"dog": "犬", "cat": "猫"}
print("辞書の要素数は:", len(dict_obj))
辞書の要素数は: 2

タプルオブジェクトの要素数は、次のように求められます。

In [17]:
tuple_obj = (1, 2, 3)
print("タプルの要素数は:", len(tuple_obj))
タプルの要素数は: 3

リストオブジェクトの要素数は、次のように求められます。

In [18]:
list_obj = [1, 2, 3, 4]
print("リストの要素数は:", len(list_obj))
リストの要素数は: 4

文字列オブジェクトの文字数は、次のように求められます。

In [19]:
str_obj = "12345"
print("文字列の長さは:", len(str_obj))
文字列の長さは: 5

辞書・タプル・リスト・文字列と、どの型のオブジェクトでも、コレクション であれば、同じように len() 関数で要素の数を求められます。

len()関数については、while文を使ったリストのループ処理 でも紹介していますので参照してください。

コレクションの比較演算子

コレクションは、比較演算子== 演算子や != 演算子で、値が等しいかどうかを判定できます。

== 演算子でコレクション同士を比較すると、同じ値のコレクションなら True を、異なっていれば False を返します。

In [82]:
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}

print("dict1とdict2は等しいか?", dict1 == dict2)

list1 = [1, 2, 3]
list2 = [1, 2, 4]
print("list1とlist2は等しいか", list1 == list2)
dict1とdict2は等しいか? True
list1とlist2は等しいか False

!= 演算子でコレクション同士を比較すると、同じ値のコレクションならFalse を、異なっていれば True を返します。

In [84]:
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}

print("dict1とdict2は異なる値か?", dict1 != dict2)

list1 = [1, 2, 3]
list2 = [1, 2, 4]
print("list1とlist2は異なる値か?", list1 != list2)
dict1とdict2は異なる値か? False
list1とlist2は異なる値か? True

シーケンスの比較演算子

タプルやリスト、文字列などのシーケンスオブジェクトは、 <<=>>= などの演算子で、値の大小を判定できます。

In [93]:
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
True
False

シーケンスではない、辞書オブジェクトなどのコンテナオブジェクトは、 < などによる大小の比較はできません。比較すると、次のようなエラーとなります。

In [95]:
dict1 = {"dog": "犬", "cat": "猫"}
dict2 = {"dog": "犬", "cat": "猫"}

print(dict1 <= dict2)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-95-f273e382d9ed> in <module>
      2 dict2 = {"dog": "犬", "cat": "猫"}
      3 
----> 4 print(dict1 <= dict2)

TypeError: '<=' not supported between instances of 'dict' and 'dict'

シーケンス同士の値の比較は、先頭の要素から順番に同じインデックス同士の値を比較して、先に小さい値となったシーケンスが小さい値となります。

例えば、上記のように (1, 2, 3)(1, 2, 4) を比較した場合、

  1. 最初の要素の 11 を比較する。同じ値なので、次の値をチェックする。
  2. 2番めの要素の 22 を比較する。同じ値なので、次の値をチェックする。
  3. 3番目の要素の 34 を比較する。 3 < 4 なので、(1, 2, 3)(1, 2, 4) よりも小さい。

のように比較を行います。

比較するシーケンス同士の長さが異なる場合、短いシーケンスの要素と長いシーケンスの要素を比較してすべて等しければ、短い要素のほうが小さい値となります。

たとえば、長さが 3 のタプル (1, 2, 3) と、長さが 4 のタプル (1, 2, 3, 4)は、長さ 3 のタプルの要素はすべて長さ 4 のタプルと一致しますので、長さが短い (1, 2, 3) が小さい値のタプルとなります。

In [94]:
value1 = (1, 2, 3)
value2 = (1, 2, 3, 4)

print(value1 < value2)
True

in 演算子

in 演算子を使うと、コレクションに値が登録されているかどうかを調べられます。

in 演算子は <== のような 比較演算子 の一種で、

 in コレクション

という式は、指定した値がコレクションに登録されていれば True を、登録されていなければ False を返します。

たとえば、リストオブジェクトに "book" という文字列が登録されているかどうか調べるには、次のように書きます。

In [15]:
list_obj = ["pen", "book", "notebook"]
if "book" in list_obj:
    print("list_objにbookが登録されています")
list_objにbookが登録されています

"book" in list_obj という式は、list_obj"book" という文字列が登録されていれば True を、登録されていなければ False を返します。

In [27]:
list_obj = ["pen", "book", "notebook"]

print("book" in list_obj)   # list_obj に "book" が含まれているか -> True
print("pencil" in list_obj) # list_obj に "pencil" が含まれているか -> False
True
False

タプルオブジェクトも、同様に in 演算子で要素の存在を確認できます。

In [29]:
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
True
False

辞書の in 演算子

辞書オブジェクトの場合、in 演算子は指定した キー登録されているかどうかを調べます。

次の辞書 dict_obj は、以下のような要素を登録しています。

dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}
キー(英単語) 値(日本語)
dog
cat
parrot オウム

この辞書に cat という単語が登録されているか調べる場合は、in 演算子を使って次のように記述します。

In [32]:
dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}

if "cat" in dict_obj:
    print("catは", dict_obj["cat"], "です")
catは 猫 です

辞書の in 演算子については、in 演算子 でも紹介していますので参照してください。

文字列の in 演算子

文字列オブジェクトの場合も、in 演算子で中に文字が含まれているかどうかを確認できます。

In [34]:
str_obj = "hello world"

print("w" in str_obj) # "w" は str_objに含まれているか -> True
print("a" in str_obj) # "a" は str_objに含まれているか -> False
True
False

リストやタプルなど、他の種類のコンテナの場合、in 演算子に値として指定できるのは次のように一つだけです。

3 in [1,2,3,4,5]

しかし、文字列の場合には、1文字だけでなく、一連の文字を指定して検索できます。

例えば、文字列 abracadabracad という文字列が含まれているかどうか調べる場合は、次のように書けます。

In [37]:
str_obj = "abracadabra"
print("cad" in str_obj)  # "cad" は str_obj に含まれているか -> True
print("rad" in str_obj)  # "rad" は str_obj に含まれているか -> False
True
False

for文

コレクションは、for文によるループ で紹介した for 文に指定して、コレクションの要素ごとに、for 文に記述した処理を実行できます。

次の処理は、リストオブジェクトの要素を、upper() メソッド を使って大文字に変換してから出力します。

In [39]:
list_obj = ["apple", "orange", "banana"]
for fruit_name in list_obj:
    upper_name = fruit_name.upper()
    print(upper_name)
APPLE
ORANGE
BANANA

タプルの場合も、同様に for 文を使用できます。

In [40]:
tuple_obj = ("apple", "orange", "banana")
for fruit_name in tuple_obj:
    upper_name = fruit_name.upper()
    print(upper_name)
APPLE
ORANGE
BANANA

文字列を for 文に指定すると、文字列中の文字を一文字づつ取り出します。

In [45]:
str_obj = "hello"
for letter in str_obj:
    upper_letter = letter.upper()
    print(upper_letter)
H
E
L
L
O

この処理では、文字列 str_obj から文字を1文字ずつ取り出して変数 letter に代入し、upper() メソッドを使って大文字に変換してから出力しています。

辞書とfor文

辞書オブジェクトを for 文に指定すると、辞書のすべての キー を取り出して、for文に指定した処理を行います。

In [42]:
dict_obj = {"dog": "犬", "cat": "猫", "parrot": "オウム"}

for english in dict_obj:
    japanese = dict_obj[english]
    print(english, "は", japanese, "です")
dog は 犬 です
cat は 猫 です
parrot は オウム です

この処理では、辞書 dict_obj に登録されている要素のキーを一つづつ取り出して、変数 english に代入しています。変数 english の値は、最初の一回目では dog、2回目は cat、3回目は parrot になります。

for ループ内にある次の処理

japanese = dict_obj[english]

は、取り出されたキー値(変数 english)を使って dict_obj からキー値に対応する値を取り出し、変数 japanese に代入しています。

最後に、変数 englishjapanese を使って、要素を print() しています。



Amazon.co.jpアソシエイト:
Copyright © 2001-2020 python.jp Privacy Policy python_japan