Филтрирање и претраживање¶
У овој лекцији ћемо сазнати
како се филтрирају низови употребом посебне Пајтонове конструкције,
како се низови података филтрирају „пешке“ и зашто је важно да и ову вештину поседујемо и
како се тражи елемент у низу.
Филтрирање података употребом Пајтонове конструкције¶
Филтрирати податке значи из датог низа података издвојити оне који су нам на неки начин интересантни. Програмски језик Пајтон има уграђену конструкцију (list comprehension) која омогућује да филтрирамо неки низ података у односу на неки услов.
Филтрирање низа L у односу на неки услов се може постићи конструкцијом која изгледа овако:
[x for x in L if Uslov(x)]
Ова конструкција у нови низ покупи све елементе x низа L који испуњавају Uslov. То је као кад у математици напишемо:
Пример.¶
Из низа бројева A = [-1, 2, 3, 0, -3, 4, -2, -5, 3, 0, 6] издвојити све позитивне бројеве у нови низ. Потом утврдити колико
низ А има негативних елемената.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Poz_neg.py.
Пример.¶
Написати Пајтон функцију која из низа стрингова издваја оне који имају највише пет слова.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Maks_5_slova.py.
Пример.¶
Ево података о једној групи ученика:
razred = [["Ana", "ž", 13, 46, 160],
["Bojan", "m", 14, 52, 165],
["Vlada", "m", 13, 47, 157],
["Gordana", "ž", 15, 54, 165],
["Dejan", "m", 15, 56, 163],
["Đorđe", "m", 13, 45, 159],
["Elena", "ž", 14, 49, 161],
["Žaklina", "ž", 15, 52, 164],
["Zoran", "m", 15, 57, 167],
["Ivana", "ž", 13, 45, 158],
["Jasna", "ž", 14, 51, 162]]
За сваког ученика су наведени име, пол, старост (у годинама), маса (у килограмима) и висина (у центиметрима). Издвојити у један низ дечаке, а у други девојчице које имају 13 или 14 година.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Decaci_devojcice.py.
Ево и кратке видео-демонстрације:
Филтрирање података „пешке“¶
Сада ћемо показати како се из низа података могу издвојити елементи који задовољавају неки услов,
али овај пут без употребе специјалне Пајтонове конструкције [x for x in L if Uslov(x)]
коју смо користили у претходном одељку.
Идеја је једноставна:
Направимо нови празан низ који ће бити помоћни низ; он ће временом акумулирати све елементе низа који задовољавају наведени услов;
forциклусом прођемо кроз низ; иелементе који задовољавају наведени услов додамо на помоћни низ.
Пример.¶
Написати Пајтон функцију izdvoj_pozitivne која из датог низа бројева издваја све позитивне бројеве.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Izdvoj_pozitivne.py.
Да се подсетимо:
наредба
rez = []поставља помоћни низrezна празан низ, који се означава овако:[];наредба
rez.append(x)на крај низаrezдодајеxкао нови елемент.
Када филтрирање напишемо „пешке“ то нам омогућује да лако решимо неке проблеме које иначе не бисмо брзо и елегантно могли да решимо употребом уграђене Пајтонове конструкције за филтрирање.
Пример.¶
Написати Пајтон функцију pozicije_pozitivnih која за дати низ бројева враћа индексе елемената који су позитивни.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Pozicije_pozitivnih.py.
Ево и кратке видео-демонстрације:
Пошто су нам за овај задатак потребне позиције позитивних бројева, дакле, индекси кућица у којима су
смештени позитивни бројеви, кроз низ пролазимо на други начин!
Овај пут променљива i пролази кроз редне бројеве кућица, па ако је L[i] > 0 (тј. ако i-та кућица садржи
позитиван број) на низ rez дописујемо њен индекс i.
Тражење елемента у низу¶
Тражење првог елемента са одређеном вредношћу у листи можемо да урадимо брзо помоћу функције .index() коју примењујемо на листу и која за аргумент узима тражену вредност. L.index(x) она враћа индекс првог елемента са вредношћу x у листи L.
Уколико желимо појављивање одређене вредности у делу листе који почиње индексом s, онда то наведемо као други аргумент функције. То може да нам врати друго, треће итд. појављивање ове вредности.
Пример
У наставку ћемо, вежбе ради, пробати да решимо сличне задатке писањем једноставних програма у Пајтону без коришћења функције .index().
Оператор in
Често је потребно проверити да ли се неки елемент налази у низу, и ако се налази у низу, на ком месту се јавља.
У Пајтону је веома лако проверити да ли се неки елемент налази у низу користећи уграђени оператор in.
Ево примера.
Ако желимо да одредимо где се у низу неки елемент појављује први пут, написаћемо функцију која то ради за нас.
Функција prvo_pojav(x, L) тражи прво појављивање елемента x у низу L. Ако се елемент x не јавља у низу L,
функција враћа -1.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Prvo_pojav.py.
Ова функција користи for циклус да би прошла кроз елементе низа.
У сваком пролазу кроз
forциклус проверавамо да ли је одговарајући елемент низа једнак саx. Ако је то тачно, вратимо вредност бројача, што је индекс првог појављивања елементаxу низуL.Ако се
forциклус заврши, то значи да нисмо нашли елементxу низуLпа функција враћа -1.
Ево и кратке видео-демонстрације:
Функција posl_pojav(x, L) тражи последње појављивање елемента x у низу L.
Ако се елемент x не јавља у низу L функција враћа -1.
Изврши исти програм и у Пајтон окружењу!
Покрени овај програм на свом рачунару тако што ћеш у пакету фајлова за вежбу, покренути IDLE и из потфолдеру P06 извршити програм Posl_pojav.py.
Ова функција се заснива на чињеници да је последње појављивање елемента у низу заправо прво када се кроз низ пролази здесна улево.
Ту нам је од помоћи функција reversed која обрће низ који јој је прослеђен
range(n) -> 0, 1, 2, ..., n-1
reversed(range(n)) -> n-1, n-2, ..., 1, 0
Дакле, у for циклусу ћемо овај пут кренути од крајње десне кућице у низу и кроз њега пролазити крећући се улево.
Ево и кратке видео-демонстрације: