組み込みを使用しenumerate()
ます:
>>> list(enumerate([5, 15, 15]))
[(0, 5), (1, 15), (2, 15)]
元のコードの欠点は、ループで使用x
しているという事実にありますx
が、そのループでは変更されず、値を出力した前のループからそのまま残されています。
ただし、この方法は悪い方法です。これを修正するには、インデックスによるループが必要になります。これは、Python が実行するようには設計されていません。速度が遅く、読みにくいためです。代わりに、値でループします。enumerate()
ビルトインは、かなり一般的なタスクであるため、このジョブを実行するためにあります。
あなたが本当に使いたくない場合enumerate()
(これは本当に意味がありませんが、何か他のことを一気に教えようとする恣意的な制限としてかもしれません)、さらに良い方法があります:
>>> from itertools import count
>>> list(zip(count(), [5, 15, 15]))
[(0, 5), (1, 15), (2, 15)]
ここでは を使用しますzip()
。これは、一度に 2 つのデータ セットをループするために使用される python 関数です。これは、各 iterable から最初の値のタプルを返し、次にそれぞれの 2 番目の値などを返します。これを と組み合わせるとitertools.count()
、必要な結果が得られます。
リストを手動で作成する必要性を本当に感じている場合は、Pythonic ではなく何かを行うより Pythonic な方法は次のようになります。
enumerated_list = []
count = 0
for item in data:
enumerated_list.append((count, item))
count += 1
ただし、一般的に、リスト内包表記を使用してこのようなリストを作成することに注意してください。この場合、それを行うとすぐに、以前の方法のいずれかを使用する方が理にかなっています。この種のリストの生成は非効率的で読みにくいものです。