Списъци¶
Досега споменахме низовете и диапазона като видове колекции и видяхме, че низът може да се използва и като колекция. Друг много важен и често използван тип колекции са списъците.
Списъци и низове¶
Списъците, както и низовете, могат да бъдат зададени чрез изброяване на елементите, с изключение на това, че елементите на списъка са написани между квадратни скоби:
Списъците са в много отношения подобни на низовете. Всички характеристики низовете, споменати в главата на колекциите, се прилагат и за списъци:
Списък може да бъде поставен и в променлива и обратно - елементите на списъка могат да бъдат присвоени на подходящ брой променливи.
Елементите на списъка могат да бъдат достъпни чрез името на списъка и поредния номер (индекс) на елемента, изписан в квадратни скоби
дължината на списъка се получава от функцията len
Списъците също имат някои функции, които ги отличават от низовете. Например списъците могат да бъдат разширени с помощта на функцията за добавяне:
Също така елементите на списъка могат да променят стойностите си и могат да бъдат изтрити от списъка:
Такива операции с низове не са възможни. Веднъж направен, низът остава такъв, какъвто е. Не може да бъде променен - той не може да променя дължината или стойностите на отделните елементи. Променлива, съдържаща низ, може само да получи изцяло нов низ като стойност, но по този начин предишният низ не е модифициран, а е престанал да съществува. Ето защо се казва, че низовете са неизменни.
Tuples могат да се използват за събиране на данни, които не възнамеряваме да променяме при изпълнение на програма (въпреки че можем да ги променим ръчно преди да изпълним програма). Използвайки низове, ние гарантираме, че данните няма да се променят случайно и програмата ще работи малко по-ефективно с низа, отколкото би направила със списъка.
Комплект t може да се преобразува в списък a по време на изпълнението на програмата и обратно: ‘’a = list(t)’’ или ‘’t = tuple(a)’’, но такива преобразувания рядко са необходими и по-добре да ги избягвате (ако често се прилагат за големи колекции, реализации като това може да забави значително програмата).
Съставяне на списък¶
Както вече видяхме, можем постепенно да изграждаме списъци в програма. Например, ако ни се даде набор от числа, от които искаме да копираме тези, които са по-големи от нула (и изпълним някаква допълнителна задача с тези числа последни), можем да направим това:
В началото имаме празен списък, а след това в цикъла използваме функцията за добавяне, за да добавим към списъка елементите, които искаме.
Зареждане на списък¶
По същия начин можем да заредим данни в списък:
Друг начин за зареждане на списък е първо да формирате списък с необходимата дължина и след това да присвоите заредените стойности директно на елементите на списъка в цикъла.
Използвахме израза ‘’a = [0] * n’’, за да формираме списък от n елемента. Операцията ‘’[0] * n’’ се нарича умножение на списъка. Резултатът от умножаването на списъка е сплотяване на n повторения на дадения списък. Например [0]*5 е списъкът [0, 0, 0, 0, 0], а [2, 7] * 3 е списъкът [2, 7, 2, 7, 2, 7].
Ако потребителят въведе всички елементи от списъка в един ред, разделен с интервали, ние пишем програмата така:
Използвахме функцията split(), за да разделим въведения текст на по-къси низове, съдържащи отделни числа.
split() функция:
Функцията split() е символ или текст, които искаме да използваме като разделител. Ако разделителят не е посочен, като интервал ‘’ се приема по подразбиране.
"1234 56".split() -> ["1234", "56"]
"1234,56".split(',') -> ["1234", "56"]
Резултатът от функцията split() е списък с низове. Броят на по-късите низове, които получаваме в резултат зависи от броя и разположението на разделителните знаци в началния низ. Например, ако текстът съдържа само един разделител някъде по средата, ще получим два по-къси низа. Всеки нов вид на символа за разделяне може да произведе един низ повече в получения списък (ако той наистина отделя част от началния низ от останалата част от текста).
"1;23;456;7".split(';') -> ["1", "23", "456", "7"]
" 1 234 56 7 ".split() -> ["1", "234", "56", "7"]
Примери и задачи¶
Пример - продажби
В началото на скрипта са дадени стойностите на няколко продажби в един магазин. Извадете продажбите със стойност по-голяма от 1000 и по-малка или равна на 4000 в списък, след което разпечатайте елементите от списъка.
Задачата се решава по следния начин:
Пример - скок-промени
Даден е набор от числа. Извадете числа, които се различават от предшествениците си поне с 10, след което ги разпечатайте.
Едно възможно решение е:
Задача - четни числа
Даден е набор от числа. Извадете числата, които са равномерни, и след това ги разпечатайте.
Спомнете си, че числото x е четно ако \(x \% 2 == 0\)
Задача - всяка трета дума
Даден е набор от низове. Извадете низовете, чиито индекси се делят на 3, след което ги отпечатайте.
Задача - под нулата
Даден е набор от числа. Извадете числата, които са отрицателни, а техните предшественици са положителни, след което отпечатайте извлечените числа.