Първо овладейте основите, а след това злоупотребявайте с тях.

Идвайки от свят на операции, в началото се чувствате неудобно със списъци. Този вид типове данни наистина съществуват в bash, но няма да излъжа, ако кажа, че никой не ги използва. И така, какво е списък в Python?

По принцип списъкът е тип обект, в който можете да съхранявате някои основни стойности: символи, числа, списъци, масиви...

Нека започнем с основен неподреден списък от числа:

myfirstlist = [1,5,2,4,3]
print(myfirstlist)
[1, 5, 2, 4, 3]

Доста елементарно, нали? Но, разбира се, искаме списъкът ни да бъде сортиран:

myfirstlist.sort()
print(myfirstlist)
[1, 2, 3, 4, 5]

Имайте предвид, че вашата променлива е сортирана и това не може да бъде върнато. По-добре ще бъде да съхраните сортирания списък в друга променлива и да използвате функцията sorted() вместо sort():

>>> myfirstlist = [1,5,2,4,3]
>>> mysortedlist = sorted(myfirstlist)
>>> myfirstlist
[1, 5, 2, 4, 3]
>>> mysortedlist
[1, 2, 3, 4, 5]

Ами ако искаме да добавим някои стойности в списъка? Обърнете внимание на разликите по-долу: имате функция за добавяне, която ви позволява да добавите нова стойност в края на вашия списък, но нямате функция за добавяне ! Трябва да използвате вмъкнетеедно, като позицията на символа е зададена на 0.

>>> print("adding value at the first position")
adding value at the first position
>>> mysortedlist.insert(0, 5)
>>> mysortedlist
[5, 1, 2, 3, 4, 5]
>>> print("adding value at the last position")
adding value at the last position
>>> mysortedlist.append(9)
>>> mysortedlist
[5, 1, 2, 3, 4, 5, 9]

Сега приемете, че бихме искали да премахнем дублиращи се записи... Един супер лесен начин е да използвате функцията set. Функцията set ще трансформира нашия списък в набор, който не може да съдържа дублиращи се записи. Важен момент, не забравяйте да го трансформирате обратно в списък!

>>> mysortedlist = list(set(mysortedlist))
>>> mysortedlist
[1, 2, 3, 4, 5, 9]

Добре, добре, сега имаме страхотен списък, но ще бъде по-добре да имаме всички числа между 1 и 9. Така че в нашия случай трябва да добавим 6–7–8 между 5 и 9! Супер лесно също! Нека разширим нашия списък с трите стойности и да го сортираме:

>>> mysortedlist.extend([6, 7,8])
>>> mysortedlist
[1, 2, 3, 4, 5, 9, 6, 7, 8]
>>> mysortedlist.sort()
>>> mysortedlist
[1, 2, 3, 4, 5, 6, 7, 8, 9]

Както може би забелязвате, ние не използваме функцията за добавяне тук. Функцията append приема само един аргумент, така че трябва да използваме extend със списък като параметър, за да можем да попълним правилно нашия списък.

Сега имаме красив списък, нека създадем нов само с първите 5 записа.

mysmalllist = mysortedlist[:5]
>>> mysmalllist
[1, 2, 3, 4, 5]

Отново много лесно, ние просто създаваме mysmalllist, картографирайки първите 5 елемента от нашия списък. Сега е време да използвате разбирането на списъка, за да говорите сериозно. Но какво точно представляват списъчните разбирания?

Разбиранията на списъци предоставят кратък начин за създаване на списъци. Обичайните приложения са да се правят нови списъци, където всеки елемент е резултат от някои операции, приложени към всеки член на друга последователност или итерируем, или да се създаде подпоследователност от тези елементи, които отговарят на определено условие.

И така, какво по-добро от пример. Да предположим, че искате да създадете нов списък, който съдържа елемент от нашия малък списък. Но за всеки елемент бихме искали да ги умножим по 3.

x3list = [x*3 for x in mysmalllist]
>>> x3list
[3, 6, 9, 12, 15]

По принцип това означава, че всеки елемент от списъка, наречен x (вторият), ще бъде умножен по 3. Можете също да приложите условия:

x3list = [x*3 for x in mysmalllist if x > 2]
>>> x3list
[9, 12, 15]

Ако моят X в mysmalllist е по-голям от 2, тогава го умножаваме по 3 и го вмъкваме в x3list.
И от двете страни го прави малко по-трудно, тъй като използва както списъчни разбирания, така и троичен оператор

x3list = [x*3 if x*3 > 10 else x for x in mysmalllist]
>>> x3list
[1, 2, 3, 12, 15]

Преводът е: умножаваме по 3 всеки елемент от списъка, ако резултатът е по-голям от 10, в противен случай просто поставяме x в x3list. И разбира се, можете да комбинирате и двете:

x3list = [x*3 if x*3 > 10 else x for x in mysmalllist if x > 2]
>>> x3list
[3, 12, 15]

Често ще виждате неща като тези в stackoverflow и т.н., но мисля, че не е добър начин да манипулирате списъка в началото. По-добре ще бъде да напишете класически оператор if else вътре в for цикъл, отколкото да се опитвате да го трансформирате в списък за разбиране.
Например, ако искаме да преведем обратно нашия последен x3list в класически for цикъл:

for x in mysmalllist:
  if x > 2:
    if x*3 > 10:
      x3list.append(x*3)
    else:
      x3list.append(x)

>>> x3list
[3, 12, 15]

По-лесно за четене, но отнема повече кодови редове... А какво да кажем за производителността? Предлагам ви тази полезна връзка (https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Loops), защото понякога е по-бързо да използвате map, понякога да използвате разбиране на списък, а понякога вероятно искате да разбиете for цикъл, когато е изпълнено условие...

Последният пример от нашия малък урок ще бъде функцията map, която ви позволява да картографирате функция към, в нашия случай, списък.

#Define the function first
def x3(number):
  return number * 3
#Call the map function, and transform it to a list
xx3list = list(map(x3, mysmalllist))
>>> xx3list
[3, 6, 9, 12, 15]

Така че, ако видяхме, списъците са супер мощни и са много основни в програмирането. Така че не се страхувайте да ги използвате.

Надяваме се, че сте намерили този урок за полезен, не се колебайте да коментирате с вашите въпроси / подобрения!