PythonのEnumerate()関数とは何ですか?また、どのように使用しますか?

それが何であるか

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=1enumerate(iterable, start=1)

同じ列挙オブジェクトを再利用できますか?
消費された後ではありません。それはイテレーターです。複数のパスが必要な場合は、新しいものを作成するか、リストとして具体化します。

enumerate()手動カウンターよりも速い?
効率的に実装され、コードから簿記を削除します。パフォーマンスを超えて、その明確さが主な勝利です。

Related Posts