Статья Объект List [Список] в Pyton

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Объект List [Список] - это изменяемый объект, представляющий из себя коллекцию произвольных объектов.
Тип объекта - класс.
Что бы было легче понять, давайте представим список в виде подобной схемы:

Пример списка: ['Список'].

Введите в интерпретаторе:

Python:
y = list('Список')
print(y)
Вывод будет следующим :
['С', 'п', 'и', 'с', 'о', 'к']

Что произошло?

1) Мы назначили переменной y значение list('Список')

2) Функция list создает объект 'Список'


3) Внутри объекта ['Список'] создаются объекты, словно в контейнере.

4) Каждый объект внутри списка ссылается на собственный объект в памяти, то есть, по сути является его переменной.

list.png




Каждый вложенный внутри списка объект является изменяемым, то есть его можно изменить.
Так же мы имеем возможность обращаться к элементам списка, каждый элемент имеет свой цифровой индекс.
Индексация начинается с нуля, то есть первый элемент списка всегда имеет индекс 0.

Итак, вернемся к пункту №2 - функции list, с помощью которой был создан список.

Список можно создать и другими способами. Перечислим их:

1) Функция list( )
Ввод:
y = list('Список')
print(y)
Вывод:
['С', 'п', 'и', 'с', 'о', 'к']
2) При помощи литерала с квадратными скобками - [ ]

Ввод:
y = ['Список']
print(y)
Вывод:
['Список']
Обратите внимание - функция list разбивает вводимые данные на символы, присваивая каждому из них свой объект внутри списка.
То есть объект с индексом 0 ссылается на строковой объект "С" в памяти компьютера, и так с каждым последующим символом.
При создании списка через литерал с квадратными скобками мы ввели те же данные, но теперь вся строка является объектом, на который ссылается объект списка с индексом 0

3) С помощью генератора списков

Ввод:
y = [i for i in range(len('Список'))]
print(y)
Вывод:
[0, 1, 2, 3, 4, 5]
Если синтаксис генератора вам кажется сложным и непонятен - то сначала необходимо изучить тему генераторы в python

Как можно обратиться к нужному объекту списка?
По индексу.

Номер индекса указывается в квадратных скобках после списка.
Ввод:
y = list('Список')
print(y[1])
Ввод:
print(list('Список')[1])
В обоих случаях вывод будет одинаков - под индексом 1 у нас в списке значится символ "п"

Вывод:
п

Ниже перечислены основные методы списков:

  • list.append(x) Добавляет элемент в конец списка
Ввод:
#list.append(x)
y = ['Список']
y.append(' №2')
print(y)
Вывод:
['Список', ' №2']
  • list.extend(L) Расширяет список list, добавляя в конец все элементы списка L или строку L через вызов функции list
Ввод:
#list.extend(L)
#обратите внимание - добавляемые данные в третьей строке
# будут уже обработаны функцией list(), так как не являются списком
y,z = ['Список'],['я','сказал']
y.extend(z)
y.extend('расстрельный!')
print(y)
Вывод:
['Список', 'я', 'сказал', 'р', 'а', 'с', 'с', 'т', 'р', 'е', 'л', 'ь', 'н', 'ы', 'й', '!']
  • list.insert(i, x) Вставляет на i-ый элемент значение x
Ввод:
#list.insert(i, x)
# В данном примере индекс указан под номером -1
# Отрицательное число - значит обратный отсчет, первый с конца
# последующее уменьшение числа (-2,-3) будет означать соответствующий номер
# символа с конца. Номерация с -1. (0 - всегда превый символ)
y = ['Список']
y.insert(-1,'Расстрельный')
print(y)
Вывод:
['Расстрельный', 'Список']
  • list.remove(x) Удаляет первый элемент в списке, имеющий значение x
Ввод:
#list.remove(x)
y = ['Расстрельный','Список','Расстрельный']
y.remove('Расстрельный')
print(y)
Вывод:
['Список', 'Расстрельный']
  • list.pop() Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
Ввод:
#list.pop()
y,z = ['Список','Расстрельный'],'Переменная z'
z = y.pop()
print(z)
print(y)
Вывод:
Расстрельный
['Список']
Ввод:
#list.pop(0)
y,z = ['Список','Расстрельный'],'Переменная z'
z = y.pop(0)
print(z)
print(y)
Вывод:
Список
['Расстрельный']
  • list.index(x, [start [, end]]) Возвращает положение первого элемента от start до end со значением x
Ввод:
#list.index(x, [start [, end]])
y = list('Расстрельный')
print(y)
# Возвращаем индекс первого "c"
print(y.index('с'))
# Возвращаем индекс первого символа "с"
# в диапазоне с 3 по 5 элемент списка
print(y.index('с',3,5))
# Возвращаем индекс символа "с" в диапазоне
# с 4 по 5 элемент списка и получаем ошибку, так как символ не найден
print(y.index('с',4,5))
Вывод:
['Р', 'а', 'с', 'с', 'т', 'р', 'е', 'л', 'ь', 'н', 'ы', 'й']
2
3
Traceback (most recent call last):
  File "test.py.py", line 11, in <module>
    print(y.index('с',4,5))
ValueError: 'с' is not in list
  • list.count(x) Возвращает количество элементов со значением x
Ввод:
#list.count(x)
#Проверим сколько букв "с" в списке
y = list('Расстрельный')
print(y.count('с'))
#А теперь проверим, встречается ли он в принципе?
if y.count('с'):
    print('Yes')
Вывод:
2
Yes
  • list.sort([key = функция],reverse=True/False) Сортирует список на основе функции sort.
Тут все немного сложнее.
Начнем с простого - обычная сортировка списка.
Для этого создадим три списка и назначим им переменные y,z и j, а затем отсортируем их:

Ввод:
#list.sort()
#Вводим переменные и списки
y = ['2a,','я1','5z','9j','ZERO']
z = [9,8,4,1,3,7,2]
j = ['теперь','я','разберусь','точно','с этим списком']
print('Так выглядят данные до сортировки: ','\n')
#Теперь выводим все это в консоль
print(j)
print(z)
print(y)
print('\n','А вот так они выглядят после сортировки: ','\n')
#Теперь сортируем списки методом sort
j.sort(),y.sort(),z.sort()
#А теперь выведем то, что получилось
print(j,'\n',z,'\n',y)
Обратите внимание на порядок вывода после сортировки:

Вывод:
Так выглядят данные до сортировки:

['теперь', 'я', 'разберусь', 'точно', 'с этим списком']
[9, 8, 4, 1, 3, 7, 2]
['2a,', 'я1', '5z', '9j', 'ZERO']

А вот так они выглядят после сортировки:

['разберусь', 'с этим списком', 'теперь', 'точно', 'я']
[1, 2, 3, 4, 7, 8, 9]
['2a,', '5z', '9j', 'ZERO', 'я1']
Несложно заметить, что объекты типа str (строковые) отсортированы в алфавитном порядке (вывод print(j)).
Так же учитывается раскладка, кодировка и так далее. Цифры (объекты типа int и float отсортированы) в порядке возрастания (вывод print(z)).
Смешанные данные (например - int + str) по описанным выше принципам и по первому символу (вывод print( y )).

Теперь попробуем немного усложнить - на самом деле по умолчанию метод sort запускается с аргументом reverse=False, даже если мы этого не указываем явно.
Но так же мы можем указать значение параметра reverse=True или же reverse=1, что является эквивалентными значениями. В таком случае сортировка будет произведена в обратном порядке, то есть список "перевернется задом на перед":

Ввод:
#list.sort(reverse=True)
#Вводим переменные и списки
y = ['2a,','я1','5z','9j','ZERO']
z = [9,8,4,1,3,7,2]
j = ['теперь','я','разберусь','точно','с этим списком']
print('Так выглядят данные до сортировки: ','\n')
#Теперь выводим все это в консоль
print(j), print(z), print(y)
print('\n','А вот так они выглядят после сортировки: ','\n')
#Теперь сортируем списки методом sort с аргументом reverse=True
j.sort(reverse=True),y.sort(reverse=True),z.sort(reverse=True)
#А теперь выведем то, что получилось
print(j,'\n',z,'\n',y)
Вывод:
Так выглядят данные до сортировки:

['теперь', 'я', 'разберусь', 'точно', 'с этим списком']
[9, 8, 4, 1, 3, 7, 2]
['2a,', 'я1', '5z', '9j', 'ZERO']

А вот так они выглядят после сортировки:

['я', 'точно', 'теперь', 'с этим списком', 'разберусь']
[9, 8, 7, 4, 3, 2, 1]
['я1', 'ZERO', '9j', '5z', '2a,']
А что делать, если нам нужна сортировка по каким то свои принципам? Например, у нас с вами настолько строгий режим, что тех в списке, кого мы планируем расстрелять зарядами добра и позитива из наших дел...списко эти лиц строго в цифро-буквенном обозначении! Как их можно отсортировать по нужному нам алгоритму? Например, если у одного назовем на букву в начале и цифру в конце, а другого цифра в конце, а буква в начале?
Надо: если имя начинается на букву и заканчивается на цифру - сортируем на основе цифры в конце.
Другими словами применим определенный алгоритм сортировки к каждому объекту списка в отдельности.
Для этого мы можем использовать параметр key = func, где func - это функция, в которую мы передаем каждый итерируемый объект списка. Последовательно.
При этом мы можем одновременно использовать и параметр reverse = True/False и key = func
Вот как это будет выглядеть:

Ввод:
#list.sort()
def my_sort(x)->'sort if int([-1])':
    """Если x дольше 1 символа и последний символ число
       тогда возвращаем в sort последний символ и
       сортировка производится по числу в последнем символе
    """
    return(x[-1]) if x[-1].isdigit() else x[0]

#Вводим переменные и списки
    #У нас настолько строгий режим, что вместо имен - числа и буквы
y = ['2a,','я1','5z','9j','ZERO']
#А здесь мы их сортируем по номеру камеры
z = [9,8,4,1,3,7,2]
#Здесь мы сохраним нашу мысль
j = ['теперь','я','разберусь','точно','с этим списком']
print('Так выглядят данные до сортировки: ','\n')
#Теперь выводим все это в консоль
print(j), print(z), print(y)
print('\n','А вот так они выглядят после сортировки: ','\n')
#Теперь сортируем списки методом sort с аргументом reverse=True
j.sort(reverse=True) # Сортировка реверсом
y.sort(key=my_sort) # Сортировка через функцию
z.sort(reverse=True) # И тут сортировка реверсом и заодно через функцию
#А теперь выведем то, что получилось
print(j,'\n',z,'\n',y)
Вывод:
Так выглядят данные до сортировки:

['теперь', 'я', 'разберусь', 'точно', 'с этим списком']
[9, 8, 4, 1, 3, 7, 2]
['2a,', 'я1', '5z', '9j', 'ZERO']

А вот так они выглядят после сортировки:

['я', 'точно', 'теперь', 'с этим списком', 'разберусь']
[9, 8, 7, 4, 3, 2, 1]
['я1', '2a,', '5z', '9j', 'ZERO']
  • list.copy() Поверхностная копия списка (начиная с python 3.3)
Ввод:
#list.copy()

#Здесь мы сохраним нашу мысль
j = ['теперь','я','разберусь','точно','с этим списком']
print(id(j)) #Выведем ID объекта j
z = j.copy() #Сделаем ео копию
j.append('test') #Добавим в конец списка j слово test
print(j) #Выведем то, что получилось
print(z) #Выведем список z и убедимся, что он не изменился
print(id(z)) #А тут выведем id объекта z
Вывод:
1804837660360
['теперь', 'я', 'разберусь', 'точно', 'с этим списком', 'test']
['теперь', 'я', 'разберусь', 'точно', 'с этим списком']
1804837785224
  • list.clear() Очищает список (начиная с python 3.3)

Ввод:
#list.clear()

#Здесь мы сохраним нашу мысль
j = ['теперь','я','разберусь','точно','с этим списком']
j.clear()#Очистим содержимое списка
print(j)
Вывод:
[]
*В этой теме были рассмотрены базовые возможности класса list.
Возможно позже я опубликую и дополнительный материал на эту тему.
 
Последнее редактирование:

Кирилл

Команда форума
Администратор
Сообщения
13,826
Реакции
6,168
Баллы
913
Дописал тему, добавил примеров и перечислил все методы класса на базовом уровне...
 
Сверху Снизу