Тізімді өңдеу алгоритмдері
Мұғалім журналға қарап: «Сыныптың орташа бағасы қанша? Ең жоғарғысы кімде? Үздіктер нешеу?» — деп сұрайды. Осы үш сұрақ — тізімді өңдеудің үш классикалық алгоритмі: ҚОСЫНДЫ/ОРТАША, МАКСИМУМ, ШАРТПЕН САНАУ. Бүгін оларды екі деңгейде меңгереміз: циклмен (алгоритмнің «ішін» түсіну — ҰБТ осыны сұрайды) және дайын функциялармен (жылдам жазу). Бұл сабақ — бөлімнің ең маңыздысы!
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-ге теңестіріліп, цикл ішінде әр элементпен толықтырылатын айнымалы.
«Үздіктер нешеу?», «Оң сандар нешеу?» — санауыш алгоритмі: жинақтауыштың туысы, тек қосудың орнына шарт орындалғанда 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
Кейде сан емес, ТІЗІМ керек: «тек оң сандарды бөліп ал». Алгоритм: бос тізім ашамыз, шартқа сай элементтерді 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 шығады.- Дайын функциялар: sum, min, max, len; орташа = sum/len.
- Жинақтауыш: s = 0 циклден бұрын; цикл ішінде s += x.
- Шартпен санау: k += 1 тек if орындалғанда — COUNTIF-тің коды.
- Максимум: m = a[0]-ден бастап, үлкенін кездестіргенде жаңарту.
- Сүзгілеу: бос тізім + шартпен append — жаңа тізім құру.
- Сұрыптау: көпіршікті алгоритм — көрші элементтерді салыстырып алмастыру; дайын құрал — sort() (өзгертеді) / sorted() (жаңасын қайтарады).