Лекция · 4.3

Тізімді өңдеу алгоритмдері

Мұғалім журналға қарап: «Сыныптың орташа бағасы қанша? Ең жоғарғысы кімде? Үздіктер нешеу?» — деп сұрайды. Осы үш сұрақ — тізімді өңдеудің үш классикалық алгоритмі: ҚОСЫНДЫ/ОРТАША, МАКСИМУМ, ШАРТПЕН САНАУ. Бүгін оларды екі деңгейде меңгереміз: циклмен (алгоритмнің «ішін» түсіну — ҰБТ осыны сұрайды) және дайын функциялармен (жылдам жазу). Бұл сабақ — бөлімнің ең маңыздысы!

Дайын функциялар: sum, min, max
Анықтама
sum(a) — элементтер қосындысы, min(a) — ең кішісі, max(a) — ең үлкені, len(a) — саны. Орташа мән = sum(a) / len(a).
bagalar = [5, 4, 5, 3, 5]
print(sum(bagalar))               # 22
print(max(bagalar))               # 5
print(min(bagalar))               # 3
print(sum(bagalar) / len(bagalar)) # 4.4 — орташа

Excel-дегі SUM, MIN, MAX, AVERAGE есіңде ме? Дәл солар — тек Python-ша. 3-бөлімдегі кесте функциялары мен бұл функциялардың мағынасы бірдей: деректер жиынын бір санға «жинақтау».

Жинақтауыш алгоритмі (қосынды циклмен)

sum() ішінде не болып жатыр? Мынадай цикл:

a = [4, 7, 1, 9]
s = 0                  # жинақтауыш — бастапқыда бос
for x in a:
    s += x             # әр элементті қосамыз
print(s)               # 21
Анықтама
Жинақтауыш (аккумулятор) — циклге ДЕЙІН 0-ге теңестіріліп, цикл ішінде әр элементпен толықтырылатын айнымалы.
🧺
Аналогия: жинақтауыш — жеміс теретін себет: бақшаға БОС себетпен кіресің (s = 0), әр ағаштан жеміс саласың (s += x), соңында себеттегі бар жиналған өнім — жауап.
⚠️
Жиі қате: s = 0-ді циклдің ІШІНЕ жазу! Сонда әр итерацияда қосынды қайта нөлденіп, соңында тек соңғы элемент қалады. Жинақтауыш әрқашан циклден БҰРЫН нөлденеді.
Шартпен санау

«Үздіктер нешеу?», «Оң сандар нешеу?» — санауыш алгоритмі: жинақтауыштың туысы, тек қосудың орнына шарт орындалғанда 1 қосамыз.

bagalar = [5, 4, 5, 3, 5]
k = 0
for b in bagalar:
    if b == 5:
        k += 1
print(k)     # 3 — үш бестік

Байқадың ба: бұл — 3-бөлімдегі COUNTIF-тің коды! =COUNTIF(диапазон; 5) деген формула ішінде дәл осы цикл жүреді. Шартты өзгертсең — кез келген сұраққа жауап: if b >= 4 — «4 пен 5 алғандар», if x % 2 == 0 — «жұп сандар».

Максимум іздеу алгоритмі
Анықтама
Максимум алгоритмі: «ең үлкен» деп алдымен БІРІНШІ элементті аламыз; әр элементті онымен салыстырамыз; үлкенін кездестірсек — «чемпионды» жаңартамыз.
a = [4, 9, 2, 7]
m = a[0]              # алғашқы «чемпион» — 4
for x in a:
    if x > m:
        m = x         # жаңа чемпион
print(m)              # 9
🏆
Аналогия: арм-рестлинг турнирі: бірінші қатысушы уақытша чемпион; әр жаңа қатысушы онымен күреседі; жеңсе — тақты алады. Тізім соңында тақта — нағыз чемпион.
⚠️
Жиі қате: m = 0-ден бастау! Тізім түгел теріс болса ([-5, -2, -9]), жауап қате 0 болып шығады. Дұрысы — m = a[0]: чемпион ТІЗІМНІҢ өз ішінен алынады. Минимум үшін бәрі керісінше: if x < m.
Жаңа тізім құру (сүзгілеу)

Кейде сан емес, ТІЗІМ керек: «тек оң сандарды бөліп ал». Алгоритм: бос тізім ашамыз, шартқа сай элементтерді append-пен жинаймыз.

a = [-5, 12, 0, -3, 8]
on = []
for x in a:
    if x > 0:
        on.append(x)
print(on)     # [12, 8]

Бұл — Excel СҮЗГІСІНІҢ коды: бастапқы тізім өзгермейді, шартқа сай элементтерден жаңа «көрініс» жасалады. Үш алгоритмнің үшеуі де бір қаңқаға құрылған: жинақтауыш + цикл + (шарт) — тек жинайтынымыз әртүрлі: сан ба, санақ па, тізім бе.

Сұрыптау алгоритмі
Анықтама
Сұрыптау — тізім элементтерін өсу немесе кему ретімен қайта орналастыру. Тізімнің sort() әдісі мен sorted() функциясы дайын сұрыптауды бір жолмен жасайды, бірақ ол ІШІНДЕ қалай жұмыс істейді — өз алдына алгоритм.

Ең қарапайым сұрыптау түрі — көпіршікті сұрыптау (bubble sort): көрші элементтерді ретімен салыстырып, реттілік бұзылса — орындарын ауыстырамыз. Бір толық өтуден кейін ең үлкен элемент тізімнің соңына «қалқып шығады» (сондықтан аты — көпіршікті):

a = [5, 2, 9, 1, 7]
n = len(a)
for i in range(n):
    for j in range(n - 1):
        if a[j] > a[j + 1]:
            a[j], a[j + 1] = a[j + 1], a[j]   # алмастыру
print(a)   # [1, 2, 5, 7, 9]
🫧
Аналогия: суда ауа көпіршіктері жоғары қалқиды — осы алгоритмде де әр өтуден кейін «ең ауыр емес» (ең үлкен) элемент бірте-бірте тізімнің соңына жылжиды.

Дайын құралдар да есіңде болсын: a.sort() — тізімнің ӨЗІН реттейді (None қайтарады), ал sorted(a) — бастапқы тізімге тимей, ЖАҢА сұрыпталған тізім қайтарады. Кему ретімен: a.sort(reverse=True) немесе sorted(a, reverse=True).

⚠️
Жиі қате: ішкі циклді range(n) деп жазу керек деп ойлау — дұрысы range(n - 1), өйткені a[j+1] соңғы индекстен аспау керек, әйтпесе IndexError шығады.
🎯 ҰБТ байланысы
Тізім өңдеу алгоритмдері — ҰБТ-ның программалау есептерінің ядросы.
1
Кодты «қолмен» орындап, s немесе k-ның соңғы мәнін табу.
2
Жинақтауыш циклден БҰРЫН нөлденеді — орны ауысқан қатені тану.
3
Максимум алгоритмінде m = a[0] (0 емес!) — теріс сандар қақпаны.
4
sum/len/min/max функцияларының нәтижесін есептеу.
5
sort() тізімді өзгертеді, sorted() жаңа тізім қайтарады — шатастырмау.
Сабақ қорытындысы
  • Дайын функциялар: sum, min, max, len; орташа = sum/len.
  • Жинақтауыш: s = 0 циклден бұрын; цикл ішінде s += x.
  • Шартпен санау: k += 1 тек if орындалғанда — COUNTIF-тің коды.
  • Максимум: m = a[0]-ден бастап, үлкенін кездестіргенде жаңарту.
  • Сүзгілеу: бос тізім + шартпен append — жаңа тізім құру.
  • Сұрыптау: көпіршікті алгоритм — көрші элементтерді салыстырып алмастыру; дайын құрал — sort() (өзгертеді) / sorted() (жаңасын қайтарады).