それが何であるか
Python'senumerate()任意の繰り返しの繰り返しに実行される、生成するペアに実行されるインデックスを追加する組み込みです(index, value)。直接反復したり、リストにキャストできる軽量の「列挙オブジェクト」を返します。完全な署名については、公式のドキュメントを参照してください。
なぜそれが重要なのか
- ループでエラーが発生しやすいマニュアルカウンターを削除します。
- 読みやすく、「pythonic」と比較して
range(len(...))。 - 怠lazに動作するので、大きな反復性には効率的です。
それがどのように機能するか
デフォルトでは、インデックスは0から始まります。オプションでそれを変更できますstart口論。
# Basic usage
runners = ["Lenka", "Martina", "Gugu"]
for i, name in enumerate(runners):
print(i, name)
# 0 Lenka
# 1 Martina
# 2 Gugu
# One-based indexing
for position, name in enumerate(runners, start=1):
print(position, name)
# 1 Lenka
# 2 Martina
# 3 Gugu
ボンネットの下で、enumerate()各反復でペアを生成します。構造を検査するために実現できます。
seasons = ["Spring", "Summer", "Fall", "Winter"]
print(list(enumerate(seasons)))
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
また、通常のイテレーターでもあるので、next():
it = enumerate(["a", "b", "c"], start=10)
print(next(it)) # (10, 'a')
print(next(it)) # (11, 'b')
print(next(it)) # (12, 'c')
それを使用する方法(実用的なパターン)
1)最初の項目または特定のステップを強調表示します
tasks = ["Pay Rent", "Clean Dishes", "Buy Milk"]
for idx, task in enumerate(tasks):
if idx == 0:
print(f"* {task.upper()}!")
else:
print(f"* {task}")
# * PAY RENT!
# * Clean Dishes
# * Buy Milk
2)文字列から2番目の文字ごとにつかみます
secret = "3LAigf7eq 5fhiOnpdDs2 Ra6 nwUalyo.9"
message = []
for i, ch in enumerate(secret):
if i % 2: # odd indexes only
message.append(ch)
print("".join(message))
3)ファイルコンテンツのスキャン中に行番号を追加します
lines = [
"This is atline",
"This line is fine",
"Another line with whitespace "
]
for lineno, line in enumerate(lines, start=1):
if "t" in line:
print(f"Line {lineno}: Contains a tab character.")
if line.rstrip() != line:
print(f"Line {lineno}: Contains trailing whitespace.")
4)インデックスで辞書を反復します
現代のPythonでは、挿入順序を保存するため、ペアに一貫してインデックスを付けることができます。
参照:
months = {
"january": "winter",
"february": "winter",
"march": "spring",
}
for idx, (month, season) in enumerate(months.items(), start=1):
print(f"{idx}: {month} - {season}")
# 1: january - winter
# 2: february - winter
# 3: march - spring
制限とトレードオフ
- それはリストではなく、イテレーターです。一度ループできます。ランダムアクセスが必要な場合は、にキャストします
list(...)初め。 - 単一の反復性をインデックス化します。複数のシーケンスを組み合わせている場合、
zip(...)より良いフィット感です。 - 避ける
range(len(seq))本当にインデックスのみが必要な場合を除きます。enumerate()意図と構造の両方をより明確に伝えます。
使用しない場合enumerate()
- マルチシーケンスイテレーション:優先
zip(a, b)両方の値を直接展開します。 - タスクのスライス:「最初の4文字」のようなスライスのみが必要な場合は、スライシングを使用します。
enumerate()プラスコンディショナル。 - 隣接するペア:ルートや連続したアイテムについては、
itertools.pairwise手動インデックスではなく。
# zip() beats enumerate()+index reuse for multi-sequence loops
pets = ["Leo", "Aubrey", "Frieda"]
owners = ["Bartosz", "Sarah Jane", "Philipp"]
for pet, owner in zip(pets, owners):
print(f"{pet} & {owner}")
FAQ
何をしますかenumerate()戻る?
生成するオブジェクトを列挙します(index, value)繰り返すとタプル。
1からカウントを開始するにはどうすればよいですか?
合格start=1にenumerate(iterable, start=1)。
同じ列挙オブジェクトを再利用できますか?
消費された後ではありません。それはイテレーターです。複数のパスが必要な場合は、新しいものを作成するか、リストとして具体化します。
はenumerate()手動カウンターよりも速い?
効率的に実装され、コードから簿記を削除します。パフォーマンスを超えて、その明確さが主な勝利です。













