#14. Срезы списков и сравнение списков | Python для начинающих

preview_player
Показать описание
Узнаете как выделять группы элементов из список с помощью срезов, а также выполнять групповое присваивание. Рассматриваются операторы сравнения: равно, не равно, больше и меньше.

Рекомендации по теме
Комментарии
Автор

интересно следить как падает количество просмотров с каждым последующем видео. Но автору большой респект за этот Вы великолепный преподаватель, это мы бараны)

andreychernykh
Автор

9:38 Использована операция marks += [3] Эта операция изменяет список, вставляя в него еще один элемент 3. Ранее было показано аналогичное присваивание для чисел (например, x +=1 увеличивает целую переменную на 1). Но если для чисел x +=1 это просто сокращение для x=x+1, то для списков L += S и L = L+S не одно и то же. Здесь L и S - некоторые списки. Например, операторы
L=[1, 2]
M=L
L +=[3] #изменяет список L, а заодно и М
print (L, M)
дают результат [1, 2, 3] [1, 2, 3]
Но фрагмент
L=[1, 2]
M=L
# создает новый список, который присваивается переменной L
L = L + [3]
print (L, M)
выдаст результат [1, 2, 3] [1, 2]

olegkomlev
Автор

Будет здорово, если получится в курсе увязать теорию с практическим применением) Вы очень доходчиво объясняете материал, спасибо!

IoldxmanI
Автор

Хорошие курсы - весьма доходчиво и простым языком автор доносит.Бесконечная благодарность за это.К этим курсам я бы рекомендовал книгу: "Python для начинающих" автора Джейсон Бриггс.

fgpznqj
Автор

Урок 14 Срезы списков

После опубликования настоящего комментария изменились представления о механизме создания копий в Phython. Это потребовало внести изменения в настоящий комментарий.

1. Утверждения из видео «... Срез создает новый список, который содержит соответствующие элементы...» (тайминг видео 1:28) и «...Это как раз говорит о том, что вот этот вот срез, вот эта вот коллекция, она совершенно независима от начального списка...» (тайминг видео 2:03) — не всегда будут справедливы. И первое и второе утверждение полностью справедливы для приведенного на видео примера с элементами неизменяемого типа данных в списке, и Не будут справедливы для случая, если хотя бы один из элементов списка будет представлен Изменяемым типом данных.
2. Срез не создает новый список с независимыми объектами. Срез создает список из ссылок!!!, которые ссылаются на соответствующие объекты исходного списка. К примеру, элемент списка Lst[1] и элементе среза A[0] будут содержать одинаковую ссылку на один и тот же объект исходного списка - «Уфа». А элемент списка Lst[2] и элементе среза A[1] будут содержать одинаковую ссылку на один и тот же объект исходного списка - «Тверь». Еще раз, соответствующий элемент исходного списка и соответствующий элемент среза всегда будут ссылаться на один и тот же (не различные) объект исходного списка.
3. В этом несложно убедиться. Для этого необходимо в исходном списке, к примеру, объект «Уфа» сделать ИЗМЕНЯЕМОГО типа, вот так - [«Уфа»]. Тогда исходный список будет выглядеть так Lst = [ «Москва», [«Уфа»], “Тверь», «Казань»]. Срез A=Lst[1:3] будет ссылаться на следующую коллекцию - [[«Уфа»], “Тверь»]. Теперь изменим значение элемента «Уфа» на значение «Омск», вот так A[0][0] = “Омск» .В результате, в исходном списке Lst, значение «Уфа» измениться на значение «Омск». Что и подтверждает прямую связь соответствующих элементов списка и среза для случая, когда элементы списка представлены произвольными объектами именно ИЗМЕНЯЕМОГО типа.
4. Идеология создания копий в Python несколько необычна, сильно отличается об "бытовых"-общепринятых представлений о копии объекта. Этому следовало-бы посвятить отдельный комментарий.
5. По моему мнению, о важности концепции Изменяемых данных в языке Python следовало бы рассказывать в самом начале изучения языка и уделить этой концепции достаточное время.

stvvjid
Автор

О механизме формирования Среза произвольного списка.

Все утверждения ниже будут справедливы для Срезов любых упорядоченных итерируемых объектов (строка, список, кортеж).

Все началось с того, что при знакомстве со Срезами было непонятно, почему при формировании Среза строки А[ i: j] элемент исходной строки А с первым индексом Среза (”i”) в результат Среза включается, а элемент исходной строки А со вторым индексом Среза (”j”) - не включается.
Так языки программирования не пишутся.
В результате поиска ответа на поставленный вопрос выяснилось следующее....

Модель работы Среза.
В основе действия оператора Среза строк лежит процедура “Исключения Пересечения” двух упорядоченных множеств (списков), или, в терминах школьной математики, - операция “Вычитания” одного списка из другого.
Грубо, утверждение выше можно записать следующим образом:
Срез А[ i: j: dir_step] = Изменяемый список(порожденный i) — Вычеркиваемый список (порожденный j).

Правило формирование Изменяемого и Вычеркиваемого списков Среза следующие:
п.1. Индекс ”i” в параметрах Среза отвечает за формирование Изменяемого списка, который включает в себя все элементы исходного списка А начиная с элемента с индексом ”i” и заканчивая включением крайнего (последнего) элемента исходного списка А.
п.2. Индекс ”j” в параметрах Среза отвечает за формирование Вычеркиваемого списка, который включает в себя все элементы исходного списка А начиная с элемента с индексом ”j” и заканчивая включением крайнего (последнего) элемент исходного списка А.
Замечание: Термин “...крайнего (последнего)...” выбран не случайно, но осознанно. За детальными разъяснениями см. раздел про параметр ”dir_step”.
Процедура “Вычитания” реализуется последовательным вычеркиванием из Изменяемого списка всех элементов содержащихся в Вычеркиваемом списке (это очень экономичная, с вычислительной точки зрения, процедура).

Пример формирования Среза A[2:4] из исходного списка: A= [0, 1, 2, 3, 4, 5, 6, 7] .
Изменяемый список = [2, 3, 4, 5, 6, 7]
Вычеркиваемый список= [4, 5, 6, 7]
Последовательно, справа налево, вычеркиваем поочередно совпадающие элементы в обоих списках: сначала 7-ки, затем 6-ки, потом 5-ки, и, наконец, 4-ки.
В результате, Срез A[2:4] вернет список [2, 3].

Теперь ясно, что раз элемент с индексом ”j” вычеркивается из Изменяемого списка, то Срез списка А элемент с индексом ”j” содержать и не будет.

Общие Правила формирования Среза списка А, в терминах списков (но не индексов)

Правило.1. Если поле Среза для индекса ”i” пустое, то в Изменяемый список заносится Исходный полный список А (ну надо же нам из чего-то вычеркивать), в противном случае — Изменяемый список формируется по алгоритму п.1.

Правило.2. Если поле Среза для индекса ”j” пустое, то Вычеркиваемый список ПУСТОЙ — ничего вычеркивать не будем, в результате Срез равен Изменяемому списку. В противном случае Вычеркиваемый список формируется по алгоритму п.2.

О назначении параметра Среза ”dir_step”.

В параметре “dir_step” важен Знак и Величина параметра.
а) Если значение параметре “dir_step” >= 0 (неотрицательно или параметр не указан), то перебор элементов, при формировании Изменяемого и Вычеркиваемого списков ведется Слева- Направо, последним элементом обеих списков будет крайний правый элемент исходного списка - А[-1].
Для примера: Срез А[2: 4: 1]
Исходный список A = [0, 1, 2, 3, 4, 5, 6, 7]
Изменяемый список = [2, 3, 4, 5, 6, 7]
Вычеркиваемый список = [4, 5, 6, 7]
В результате Срез А[2: 4: 1] вернет [2, 3].

б) Если значение параметре “dir_step” < 0 (строго отрицательный), то перебор элементов, при формировании Изменяемого и Вычеркиваемого списков ведется в ОБРПАТНОМ Порядке СПРАВА-НАЛЕВО (как у арабов). Поэтому, последним элементом обеих списков будет крайний левый элемент исходного списка - А[0].
Для примера: Срез А[5: 2: -1]
Исходный список A = [0, 1, 2, 3, 4, 5, 6, 7]
Изменяемый список = [0, 1, 2, 3, 4, 5]
Вычеркиваемый список = [0, 1, 2]
В результате Срез А[5: 2: -1] вернет [3, 4, 5].

Про величину параметра “dir_step” в интернете написано верно, повторятся не буду.

В заключении.
Выше описан лишь механизм формирования Среза. А хотелось бы еще сказать про идеологию Срезов. Срез возвращает данные, но оперируем в Срезе мы не ими. Если картина сложится, поделюсь своим взглядом.

stvvjid
Автор

Спасибо автору за курс, я продолжаю становиться лучше, чтобы повысить свое благосостояние

thebaingames
Автор

отличный курс! с удовольствием смотрю уроки, всё мне понятно

ordinar
Автор

Хорошо рассказываете. Решил повторить изученный материал, и что-то новое узнал.

supercryning
Автор

Спасибо за урок, посмотрела с удовольствием

elenalevasheva
Автор

9:55 Ошибка возникает из-за того, что в коллекции нечётное (точнее не кратное 3-м) количество элементов

oopsimath
Автор

Большое спасибо! Когда вы рассказывали про то, что через срез без начального и конечного индекса ( [ : ] ) часто создают копии списка, подумал, а почему просто нельзя для дублирования списка присвоить ему другую переменную (lst = lst2). Оказалось, что в случае внесения каких-либо изменений в первоначальный список, дубликаты сделанные через срез и через присвоение переменной поведут себя по-разному. Дубликат сделанный через срез - останется без изменений (сохранит первоначальный вид спика), а дубликат сделанный через присвоение переменной - изменится соответственно внесённым изменениям в первоначальный список.

А ещё давно интересует такой вопрос. Как я понял удаление элемента из списка, или печать(вывод) элемента списка может быть осуществлено только для одного конкретного элемента (индекса) или для среза. А возможно ли удалить или напечатать, например: 0, 2 и 4 индексы списка? Буду благодарен, если ответите, так как очень любопытно.

PS: я изучаю уроки частями для лучшего их освоения, поэтому, если ответ на мой вопрос содержится в конце этого урока или в будущих уроках, то тогда прошу прощения за вопрос, и прошу вас не тратить ваше время на ответ в таком случае.

DmitryTimofeev
Автор

Шаги, это жесть конечно вынос мозга. Нужно очень напрячься (лично для меня), чтобы понять "шаги". На практике при написании ботов (например для тг), сайтов, эти "шаги" практически не используются. Чтобы не выгорать и не ломать себе мозг на старте, советую не зацикливаться на чем-то не особо нужном вроде "шагов". Лично у меня цель научиться делать сайты, ботов для телеграмм для начала и если я буду тратить кучу времени, чтобы понять не особо нужную мне тему, я очень быстро выгорю. Подход должен быть с умом. То, что не понял, придет с опытом

macktraher_mvp
Автор

Я из Уфы, интересно видеть название этого города )

shaykhinurov
Автор

Ну по сути все тоже самое что и со строками, кольто вместо букв, элементы списка, которые можно рассматривать будто бы символы

lindx
Автор

О механизмах Копирования объектов в языке Python.
(решил оставить комментарий здесь, поскольку это видео подтолкнуло разобраться с копирование объектов).

Перефразируя Роберту Иерузалимского, одного из авторов языка Lua, когда-то заявившего, что - «Таблицы - наше все», Гвидо ван Россему (ок. спасибо, поправил фамилию), сами знаете кто, следовало бы объявить - «Таблицы ссылок — наше все!».

Процедура создание копий объектов данных является очень затратной вычислительной процедурой. Поэтому в языке Python процедура Копирования, реализована, в зависимости от типа данных оригинала, одним из следующих способов:
1) для объектов данных неизменяемого типа, кортежей, а также, для простых, без вложения, списков и множеств - через создание простой ссылки на исходный объект копирования (оригинал) с помощью оператора присваивания - « = » (равно) ;
2) для вложенных списков и множеств — по двух шаговой схеме, сначала оригинал перепаковываем методом “(*Object, )” в такой же вложенный (многоуровневый) кортеж; затем многоуровневый кортеж перепаковываем
методом “[*Object, ]” обратно в в многоуровневый список;
3) для копирования словарей, вероятно, применяются именованные кортежи, но с ними я еще не разобрался, поэтому это не точно, только версия.

И еще одно замечание — Оператор id() Бесполезен для определения того факта, что один объект является копией другого.

stvvjid
Автор

Посоветуйте, какие еще курсы пройти после этого курса, что бы иметь преимущество для устройства на работу ? Пока это абстрактная работа, неизвестно что нужно будет.

Rusia-
Автор

А можно ли присвоить определенным элементам среза одно и то же значение, не прописывая их количество. Ну что-то типа marks [:8:2]=5? То есть чтобы все элементы от начала до восьмого с шагом 2 изменились на 5? Как это реализовать в Python?

liteocy
Автор

lst1 = [4, 6, 8, 5] lst2 = slice(1, 3) print(lst1[nnn]) >>> [6, 8] ; ведь это тоже срез?

boyboy-hkki
Автор

Объясните тупому почему инверсия списка работает marks[::-1], а не marks[-1::], когда marks[0::] работает как надо? Спасибо

EugeneShperl