ホーム > 記事 > Python > python入門 > 【Python】繰り返し | イテラブル

記事

【Python】繰り返し | イテラブル

ここではpythonで繰り返しの処理を書く際にお世話になるイテラブルオブジェクトについて述べます。

for a in B:

と記載したき、Bとして許されるオブジェクトのことをイテラブルオブジェクトといいます。正確に言えば次のいずれかの条件を満たすオブジェクトになります。

  1. __iter__メソッドを定義しているオブジェクト
  2. __getitem__メソッドをシーケンスとして定義したオブジェクト

上記2つのどちらかを満たすオブジェクトをイテラブルオブジェクトといいます。

ここではイテラブルオブジェクトのうち代表的なものをいくつか紹介します。

 

目次

  1. 文字列
  2. リスト
  3. 配列
  4. タプル
  5. 辞書(ディクショナリ)
  6. セット
  7. ジェネレータ
  8. まとめ

文字列

pythonでは文字列もイテラブルオブジェクトになっています。イテラブルとしてループを回すと以下のように先頭から1文字ずつ取り出すことができます。

a = "こんにちは。"

for c in a:
    print(c)

処理結果。

こ
ん
に
ち
は
。

↑ 目次へ

リスト

リストの中に以下のようなデータが入っているとします。

a = ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"]

for c in a:
    print(c)

実行すると以下のようになります。

月曜日
火曜日
水曜日
木曜日
金曜日
土曜日
日曜日

リストの中に入っているデータの型は別々でも問題ありません。

a = [0,"abc","def",4,5,6,7]

for c in a:
    print(c)

実行結果

0
abc
def
4
5
6
7

↑ 目次へ

配列

配列はリストと非常によく似ています。用いるには以下のようにarrayパッケージをインポートする必要があります。

from array import array

a = array('l',[1,2,3,4,5,6])

for c in a:
    print(c)

処理結果は以下のようになります。

1
2
3
4
5
6

リストと配列の一番の違いは配列には異なる型を入れる事ができないことです。クラスなど独自の型を入れることもできません。入れることができるのは型コードで存在する型だけです。その代わりメモリ効率が良く高速に動作します。

実際に異なる型をいれようとするとどうなるか試してみます。

from array import array

a = array('l',[1,2,3,4,5,6])
a.append("abc")

上記を実行すると以下のようにTypeError例外が発生します。

Traceback (most recent call last):
  File "iterable-01-array-exception.py", line 4, in 
    a.append("abc")
TypeError: an integer is required (got type str)

型コードは以下のようになっています。

型コード一覧
型コード Cの型 Pytyonの型 最小サイズ(バイト単位)
'b' signed char int 1
'B' unsigned_char int 1
'u' wchar_t unicode型 2
'h' signed short int 2
'H' unsigned short int 2
'i' signed int int 2
'I'(大文字アイ) unsigned int int 2
'l'(小文字エル) signed long int 4
'L' unsigned long int 4
'q' signed long long int 8
'Q' unsigned long long int 8
'f' float 単精度浮動小数点 4
'd' double 倍精度浮動小数点 8

 

↑ 目次へ

タプル

リストは[]を使いますがタプルは以下のように()を使います。

a = (1,'Suzuki','Taro')

for i in a:
    print(i)

実行結果

1
Suzuki
Taro

リストとタプルの違いはタプルは中のデータを書き換えることができない事です(そのような仕組みも提供されていません)。

↑ 目次へ

辞書(ディクショナリ)

ディクショナリは[]や()ではなく{}を使います。またキーと値(Value)がペアで入っています。配列は〇番目の値という形で取り出しますが、ディクショナリはキーに対応する値という形で取り出します。forを用いてkeyとvalueをセットで取り出すには下のようにitems()を用います。

d = {
    "東京都":13515271
    ,"神奈川県":9126214
    ,"大阪府":8839469
    ,"愛知県":7483128}

for k,v in d.items():
    print("{} : {}".format(k,v))

実行結果

東京都 : 13515271
神奈川県 : 9126214
大阪府 : 8839469  
愛知県 : 7483128

ちなみにd.items()を使わず、dのみの場合とどうなるでしょうか。

d = {
    "東京都":13515271
    ,"神奈川県":9126214
    ,"大阪府":8839469
    ,"愛知県":7483128}

for k in d:
    print(k)

実行結果

東京都
神奈川県
大阪府  
愛知県

上記のようにキーのみが表示されます。もしイテレータの中でキー以外に値も必要な場合には、キーを元にディクショナリにアクセスして値を取得する必要がでできます。

↑ 目次へ

セット(集合型)

セット(集合型)はリストと似ていますが以下の違いがあります。

  1. 要素の重複がない
  2. 順番を保持しない
  3. 集合演算ができる

例えば以下のコードを実行した場合どうなるでしょうか。

myset = set(["佐藤","鈴木","山田","佐藤"])
print(myset)

for s in myset:
    print(s)

実行結果

{'鈴木', '佐藤', '山田'}
鈴木
佐藤
山田

実行結果の最初の行がsetの値。2行目以降がイテレータを用いてsetの内容を一つ一つ表示したものです。元の配列には佐藤さんが2回でできますが、集合にすると1回だけになります。また順番に集合を表示して分かる通り順番が保持されていないことが分かるとおもいます。

集合演算をしてみます。

a = set(["佐藤","鈴木","山田"])
b = set(["今井","鈴木","林"])

print(a)
print(b)

print(a.union(b)) # a∪bを表示
print(a & b) # a ∩ bを表示

実行結果

{'佐藤', '鈴木', '山田'}
{'林', '今井', '鈴木'}
{'林', '今井', '佐藤', '鈴木', '山田'}
{'鈴木'}

きちん集合として演算されているのがわかります。

↑ 目次へ

ジェネレータ

ジェネレータは状態を保持している関数のようなものです。 関数は戻り値を戻した状態を保持しませんがジェネレータは値を戻したときの状態を保持します。 値を戻すときにreturnではなくyieldを使います。yieldを使った時点の状態を保持してyieldの引数を返り値として戻します。次にジェネレータが呼ばれた際にはyieldの次の行から実行されます。

def adds():
    a = 1
    while 1:
        yield a
        a += a

for i in adds():
    print(i)
    if i > 100:
        break

実行結果は以下のようになります。

1
2  
4  
8  
16 
32 
64 
128

↑ 目次へ

まとめ

今回は様々なイテラブルなオブジェクトを触ってみました。それぞれ特徴があり、うまく活用すると可読性および可視性の高いプログラムを記述することができます。ぜひ日頃の業務に役立ててください。

↑ 目次へ

この記事へのコメント

コメントはまだありません。

コメントを送る

必須
必須  
※ メールアドレスは公開されません
任意
必須
Loading...  画像の文字を入力してください