Skip to content

Python enumerate() nima?

Pythonda ro'yxatdagi elementlarni aylanib chiqayotganda ba'zan elementning o'zi bilan birga uning tartib raqami ham kerak bo'ladi. Masalan foydalanuvchilar ro'yxatini ekranga 1. Akmal, 2. Bekzod, 3. Sherzod ko'rinishida chiqarish kerak. Shunday paytda enumerate() ishlatiladi.

Oddiy qilib aytganda enumerate() list, tuple, string yoki boshqa iterable obyektni aylanib chiqadi va har bir elementga tartib raqam qo'shib beradi.

Keling ro'yxatdagi ismlarni tartib raqami bilan chiqaramiz:

python_enumerate.py
1
2
3
4
names = ["Akmal", "Bekzod", "Sherzod"]

for index, name in enumerate(names):
    print(index, name)

Natija:

0 Akmal
1 Bekzod
2 Sherzod

Bu yerda enumerate(names) har safar ikkita qiymat qaytaryapti:

  • index - elementning tartib raqami
  • name - ro'yxatdagi elementning o'zi

Pythonda index odatda 0 dan boshlanadi. Shuning uchun birinchi elementning indexi 0.

Foydalanuvchiga ko'rinadigan ro'yxatlarda raqamni 0 dan boshlash to'g'ri bo'lmaydi. Bunday holatda sanash 1 dan boshlanadi. enumerate() da buning uchun start parametri bor:

python_enumerate.py
1
2
3
4
names = ["Akmal", "Bekzod", "Sherzod"]

for number, name in enumerate(names, start=1):
    print(f"{number}. {name}")

Natija:

1. Akmal
2. Bekzod
3. Sherzod

Ko'p holatlarda start=1 juda qulay. Masalan, menyu, ro'yxat, jadval qatori yoki fayldagi qator raqamini ko'rsatishda.


Boshlovchilar ko'pincha bunday kod yozadi:

range_len.py
1
2
3
4
names = ["Akmal", "Bekzod", "Sherzod"]

for i in range(len(names)):
    print(i, names[i])

Bu kod ishlaydi. Lekin uni o'qish biroz qiyinroq. enumerate() bilan esa maqsad aniqroq ko'rinadi:

python_enumerate.py
1
2
3
4
names = ["Akmal", "Bekzod", "Sherzod"]

for index, name in enumerate(names):
    print(index, name)

Bu kodni o'qigan odam darhol tushunadi.

Tip

Agar sizga element ham, uning tartib raqami ham kerak bo'lsa enumerate() ishlating.

enumerate() qanday ishlaydi?

enumerate() ni taxminan mana bunday tasavvur qilish mumkin:

python_enumerate.py
1
2
3
4
5
6
def my_enumerate(items, start=0):
    number = start

    for item in items:
        yield number, item
        number += 1

Ya'ni har bir element yoniga bitta raqam qo'shilyapdi.

Muhim jihati enumerate() hamma elementlarni oldindan yangi ro'yxat qilib yaratib olmaydi. U elementlarni generator bilan bittalab beradi. Shu sabab katta fayl yoki uzun ro'yxatlar bilan ishlash qulay.


Fayllar bilan ishlaganda ham enumerate() dan foydalanish kod yozishni anacha samarali qiladi. Masalan fayldagi bo'sh qatorlarni topmoqchimiz bunda quyidagicha ish qilishimiz mumkin:

enumerate_file.py
1
2
3
4
with open("users.csv", encoding="utf-8") as file:
    for line_number, line in enumerate(file, start=1):
        if not line.strip():
            print(f"{line_number}-qatorda bo'sh.")

Faylning 5-qatori bo'sh bo'lsa xabar ham foydalanuvchiga tushunarli chiqadi:

5-qatorda bo'sh.

enumerate() list comprehension ichida ham ishlatiladi. Masalan ismlarni ro'yxatda raqamlaymiz:

enumerate_comprehension.py
1
2
3
4
5
names = ["Akmal", "Bekzod", "Sherzod"]

labels = [f"{i}. {name.title()}" for i, name in enumerate(names, start=1)]

print(labels)

Natija:

['1. Akmal', '2. Bekzod', '3. Sherzod']

Bu usul qisqa va tushunarli. Lekin kod juda murakkablashib ketsa, oddiy for bilan yozgan yaxshiroq.


enumerate()ni dictionary bilan ham ishlatishimiz mumkin. Lekin ehtiyot bo'lish kerak. Dictionary ustida ishlatilsa, dictionarydagi kalitlarni raqamlaydi:

enumerate_dict.py
1
2
3
4
5
6
7
user = {
    "name": "Akmal",
    "age": 20,
}

for index, key in enumerate(user):
    print(index, key)

Natija:

0 name
1 age

Bu yerda value kelmadi. Faqat kalitlar keldi. Agar dictionarydan key va value olish kerak bo'lsa, items() ishlatiladi:

dict_items.py
1
2
3
4
5
6
7
user = {
    "name": "Akmal",
    "age": 20,
}

for key, value in user.items():
    print(key, value)

Agar key, value va tartib raqami birga kerak bo'lsa enumerate() bilan items() ni birga ishlatish mumkin:

enumerate_dict.py
1
2
3
4
5
6
7
user = {
    "name": "Akmal",
    "age": 20,
}

for index, (key, value) in enumerate(user.items(), start=1):
    print(index, key, value)

Natija:

1 name Akmal
2 age 20

Agar ikkita ro'yxatni birga aylanish va shu bilan birga raqam ham kerak bo'lsa enumerate() va zip() ni birga ishlatish mumkin:

enumerate_zip.py
1
2
3
4
5
names = ["Akmal", "Bekzod", "Sherzod"]
scores = [90, 85, 97]

for number, (name, score) in enumerate(zip(names, scores), start=1):
    print(f"{number}. {name}: {score}")

Natija:

1. Akmal: 90
2. Bekzod: 85
3. Sherzod: 97

Qachon enumerate() ishlatmaslik kerak?

Agar sizga faqat element kerak bo'lsa, enumerate() shart emas.

Agar sizga qo'shni elementlar kerak bo'lsa masalan names[i] va names[i + 1], unda indeks bilan ishlash to'g'ri bo'ladi.

enumerate() quyidagi holatlarda ishlatiladi:

  • ro'yxatdagi element bilan birga tartib raqami kerak bo'lsa
  • foydalanuvchiga raqamlangan ro'yxat chiqarish kerak bo'lsa
  • fayl qatorlarini raqamlash kerak bo'lsa
  • loop ichida index va value ikkalasi ham kerak bo'lsa

enumerate() range(len(...)) ga qaraganda o'qilishi osonroq va maqsadni aniqroq ko'rsatadi. Agar loop ichida elementning o'zi ham, raqami ham kerak bo'lsa, birinchi bo'lib enumerate() haqida o'ylagan yaxshi.

Foydalanilgan manbaalar