【Python】リストを無限にループさせるときは itertools.cycle() を使う

既存のPythonリスト(list)を『無限ループ』に変換する方法です。

イテレータツールズのサイクルを使うのが一般的です。

import itertools
iterator = itertools.cycle(['x', '+', '*', 'o'])

この iterator を『next()』や『for文』に渡すと、リストの内容を順番に、延々と取得できます。

Python公式マニュアルの場所です。

itertools — 効率的なループ実行のためのイテレータ生成関数
itertools.cycle(iterable)

itertools.cycle()は、リストの内容をコピーして保持するので、そのぶんメモリを多く消費するとのことです。なので、元のリストを再利用しないなら、del文で削除するのもアリだと思います。

有限のリストを、無限リストのようにして使うことができます。

itertools.cycle() は、リストをローラースタンプのようにしてくれるメソッドです。

next()でリストを無限に取得する

有限のリストを itertools.cycle() で無限ループさせるコード例です。

next()関数を使って、リストの内容を何回でも取得できます。

Python マニュアル
組み込み関数 next(iterator[, default])

リストの代わりに、タプル(tuple)を使ってもOKです。

コード

next()で、リストの内容をくりかえし取得しています。

途中で元のリストを削除していますが、通常は消さなくて大丈夫です。

"""リストを無限にループするコード next()"""
import itertools

# リストを作成 (タプルでもOK)
datas = ['x', '+', '*', 'o']

# リストをループするイテレータを作成
datas_iterator = itertools.cycle(datas)

print('next()でイテレータを使う')
print(datas)

# 元のリストはいらないので削除
#(メモリ節約の必要がある場合のみ)
del datas

print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))

print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))
print(next(datas_iterator))

print('End')

実行結果

意図したとおり、リストの内容がループしています。

next()でイテレータを使う
['x', '+', '*', 'o']
x
+
*
o
x
+
*
o
x
+
End

for文でリストを無限に取得する

有限のリストを itertools.cycle() で無限ループさせるコード例です。

for文を使って、リストの内容を何回でも取得できます。

リストの代わりに、タプル(tuple)を使ってもOKです。

コード

for文で、リストの内容をくりかえし取得しています。

このままだと、永遠に終わりません。

そこで、enumerate()で連番を作り、上限を指定してブレークしています。

Python マニュアル
組み込み関数 enumerate(iterable, start=0)

途中で元のリストを削除していますが、通常は消さなくて大丈夫です。

"""リストを無限にループするコード for文"""
import itertools

# リストを作成 (タプルでもOK)
datas = ['x', '+', '*', 'o']

# リストをループするイテレータを作成
datas_iterator = itertools.cycle(datas)

print('for文でイテレータを使う')
print(datas)

# 元のリストはいらないので削除
#(メモリ節約の必要がある場合のみ)
del datas

for (n, data) in enumerate(datas_iterator):
    # 要素を表示
    print('n: %d %s' % (n, data))

    # 上限を指定してbreak
    if n >= 9:
        break

print('End')

実行結果

意図したとおり、リストの内容がループしています。

for文でイテレータを使う
['x', '+', '*', 'o']
n: 0 x
n: 1 +
n: 2 *
n: 3 o
n: 4 x
n: 5 +
n: 6 *
n: 7 o
n: 8 x
n: 9 +
End

 無限リストの用途

matplotlibのマーカー・線種・色の指定に便利だった

matplotlibでたくさんのデータ系列(けいれつ)をプロットするときに、無限リストが便利でした。

『マーカーの種類』、『線種(せんしゅ)』、『色』のリストをループさせることで、データ系列が増えても自動的にフォーマットを割り当てることができました。

タイトルとURLをコピーしました