Python / List ба Dict Comprehension

List ба Dict Comprehension

Comprehension бол Python-ны хамгийн гоёмсог онцлогуудын нэг юм. Олон мөрийн for давталтыг нэг мөрөнд товч бичих арга — ингэснээр код уншихад хялбар, бичихэд хурдан болдог.

Эхлэгчид эхэндээ арай ер бусын харагдах ч дасаад унших дуртай болчихдог. Аажмаар сур — эхлээд for давталтаар бодоод дараа нь comprehension болгоорой.

List Comprehension

Үндсэн хэлбэр

Уламжлалт for давталтаар:

python
# Энгийн давталт
тоонууд = []
for i in range(1, 6):
    тоонууд.append(i * 2)

print(тоонууд)   # [2, 4, 6, 8, 10]

List Comprehension ашиглан:

python
тоонууд = [i * 2 for i in range(1, 6)]
print(тоонууд)   # [2, 4, 6, 8, 10]

Хоёр хувилбар яг ижил үр дүн гаргана — зөвхөн бичлэгийн хэлбэр өөр.

Бүтэц

код
[үр_дүн for хувьсагч in цуглуулга]
  • үр_дүн — шинэ list-ийн элемент болох илэрхийлэл
  • хувьсагч — давталтын хувьсагч
  • цуглуулга — давтах объект

Нөхцөл нэмэх (if)

Comprehension-д if нэмж зөвхөн нөхцөл хангасан элементүүдийг шүүж авч болно:

python
тоонууд = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# Зөвхөн тэгш тоонуудыг авах
тэгш = [n for n in тоонууд if n % 2 == 0]
print(тэгш)   # [2, 4, 6, 8, 10]

# 5-аас их тоонуудыг квадратлах
том = [n ** 2 for n in тоонууд if n > 5]
print(том)    # [36, 49, 64, 81, 100]

Бодит жишээ

python
нэрс = ["  Болд  ", "Сарнай  ", "  Төгс"]

# Цагаан зайг арилгаж, том үсгээр эхлүүлэх
цэвэр_нэрс = [нэр.strip().title() for нэр in нэрс]
print(цэвэр_нэрс)   # ['Болд', 'Сарнай', 'Төгс']
python
оноонууд = [45, 82, 91, 60, 73, 55, 88]

# Тэнцсэн сурагчдын оноо (60+)
тэнцсэн = [оноо for оноо in оноонууд if оноо >= 60]
print(тэнцсэн)   # [82, 91, 60, 73, 88]

Dict Comprehension

Dict Comprehension нь Dictionary-г товч аргаар үүсгэнэ. Бүтэц нь List Comprehension-тай ижил ч {} хаалт болон key: value хосыг ашигладаг:

python
{key_илэрхийлэл: value_илэрхийлэл for хувьсагч in цуглуулга}

Жишээ

python
нэрс = ["Болд", "Сарнай", "Төгс"]

# Нэр → нэрийн урт
урт_толь = {нэр: len(нэр) for нэр in нэрс}
print(урт_толь)
# {'Болд': 4, 'Сарнай': 6, 'Төгс': 4}
python
тоонууд = range(1, 6)

# Тоо → квадрат
квадрат = {n: n ** 2 for n in тоонууд}
print(квадрат)
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

Нөхцөл нэмэх

python
оноо = {"Болд": 85, "Сарнай": 55, "Төгс": 92, "Анар": 48}

# Зөвхөн тэнцсэн сурагчдыг авах
тэнцсэн = {нэр: дүн for нэр, дүн in оноо.items() if дүн >= 60}
print(тэнцсэн)
# {'Болд': 85, 'Төгс': 92}

Set Comprehension

Set Comprehension ч бий — {} хаалт ашиглана, Dict Comprehension-с ялгаа нь key: value хос байхгүй:

python
тоонууд = [1, 2, 2, 3, 3, 3, 4]
өвөрмөц_квадрат = {n ** 2 for n in тоонууд}
print(өвөрмөц_квадрат)   # {1, 4, 9, 16}

Comprehension vs давталт — хэзээ алийг ашиглах вэ?

Comprehension нь товч боловч хэт нарийн төвөгтэй болбол уншихад хэцүү болдог. Дараах зөвлөмжийг дагаарай:

python
# ✅ Хялбар — comprehension тохиромжтой
квадратууд = [x ** 2 for x in range(10)]

# ✅ Нөхцөлтэй — comprehension тохиромжтой
тэгш = [x for x in range(20) if x % 2 == 0]

# ⚠️ Хэт нарийн — энгийн давталт илүү уншигдахуйц
# Шүүмжгүй ашиглавал код ойлгоход хэцүү болно

Нэг comprehension нэг зорилготой байх ёстой. Хоёр давталт шаардагдах бол ихэвчлэн тусдаа for давталт ашиглах нь дээр.

Дараагийн хичээлд:

Задлан авах (Unpacking) техникийг судална — tuple, list, dictionary-н утгуудыг нэг дор хэд хэдэн хувьсагчид хуваан оноох, функцийн argument-д *args болон **kwargs ашиглах аргуудыг үзнэ.