много памяти потребуется для такой ерунды. да и под капотом всех этих методов по сути те же циклы что поднимает сложность алгоритма практически до х3, самый простой и эффективный метод это перебор в цикле с проверкой элемента на вхождение.
чего я все время замеряю ) давайте код и замеры ) В данном случае я не замерял, что под капотом - не обязательно, что перебор. Возможно какая-то более разумная реализация. сокращающая кол-во иттераций. Потом, это возможно си реализация, которая может быть на порядок быстрее, чем мы циклом побежим пайтоном. Куча Но. Еще раз, я лично не замерял, утверждать ничего не могу, но реально любопытно, если вы замерите и поделитесь Может оказаться, что вы и не правы ) И да, я это предложил как вариант, а не единственно правильное решение
@@PythonGuru_ да даже без замеров видно что тут при вызове создается 2 лишних коллекции, причем вы сами их и упоминаете. когда это массив с большим набором данных, условный курс валюты за несколько лет, то это съест очень много ресурсов. в идеале тут вообще бы без доп памяти реализация должна быть, это при условии что мы не работаем с иммутабельными данными
@@PythonGuru_ в принципе код у вас есть во всех вариациях, можете провести исследование и выложить еще одно видео с результатами) memory_profiler вроде как позволяет удобно делать замеры) Только нужно генерировать данные на 1000+ элементов, иначе разница может быть в райне погрешности
отсылка на канал python is trash вроде, не помню название, он преподносит гайды по разным языкам программирования в шуточном формате и с очень громким микрофоном, это делает ещё смешнее@@PythonGuru_
1. Нет гарантии, что пары ключей будут иметь тот же порядок, что и исходные данные. Будет верно для малых количеств, но если более порога сегментирования, очередность не гарантируется. 2. dictionary на основе бинарного дерева, т.е. сложность O(N*log(N)), значит можно найти быстрее способ. 3. Используется промежуточный контейнер для заполнения результирующего списка. Понимаю, что это питон, лучше обрабатывать пакетами. На плюсах создал бы сет в стеке, в качестве проверочного, и выходной вектор. Сет в конце прибивался бы. Сложность O(n). По памяти меньше от предложенного в видео, за счет того, что не храним пару, а только значение.
1. Уже есть, но с какой версии - не помню. Раньше не было. 2. Неправда, там хэштаблица и никакого логарифма. 3. Без промежуточного контейнера лучше O(n**2) не выйдет, а приведённое решение O(n). Хотя я бы делал с сетом руками. 4. В плюсах сет нифига не на стеке - он выделяет память в куче. И вот как раз там он на основе бинарного дерева, так что O(n*lb(n)).
@@QwDragon 2. Если хэш, смотри п.1. 3. С промежуточным контейнером, это когда индексы массива хранятся в map 4. В плюсах есть аллокатор, куда хочешь туда и храни. Насчет set/map да, но есть и unordered_set/unordered_map.
И получился анонимный алгоритм, который нужно интерпретировать в голове, чтобы понять что он делает. Хотя бы в функцию/метод с говорящим названием вынесли бы
сортировка во множестве происходит согласно хэшу данных во множестве. Для целых чисел, хэш целое число, такое же как само число, для дробных, строк, отрицательных - хэш уже высчитывается, и там порядок следования элементов бьется
Смотрю подобные советы, всегда возникает вопрос: загрузка проца и памяти как то учитывается при программировании? В каком случае нагрузка на железо оптимально?
Асимптотика линейная, как и у сета. Возможно, сет эффективнее, но в случае питона, где вызов встроенного метода работает быстрее, чем такой код на питоне, уже не факт.
@@QwDragonвстроенное преобразование будет быстрее, так как тут обычный аналог HashSet, а в случае с со словарём LinkedHashSet там расположен под капотом.
Если пользоваться python версии старше чем 3.8 там данные хранятся не в той же последовательности, что добавляются в словарь, и тогда этот метод не сработает, я правильно понимаю?
Проще говоря подключаем Словарь для того чтобы по его примеру удалить повторения букв. Сравнение и удаление. 😮 а если нет словаря? Не на что опереться?
Рекомендую, от слова очень посмотрите эти два видео, и обучение питону пойдет намного проще ua-cam.com/video/XGYxd2eUA9c/v-deo.htmlsi=2F47XsyqSu9MRnPg ua-cam.com/video/rjINFaXOmdE/v-deo.htmlsi=lXkzrl2o3_1cYOCq
@@PythonGuru_ окей, согласен что, второй медленее, так как там сложность Н квадрат. но в зависимости от количества прдпологаемых записей он будет предпочтителее, так как имеет большую гибкость и читабельность. но если важно сохронение порядка и количество записей будет очень небольшое, то последний вариант будет предпочтителен. но только в этом случае. потому что в последнем варианте выполяется несколько операций, вместо одной set(). а случаев, когда тебе нужно получить список не изменяя порядка, на моей практике наверное ниразу не было. да так, чтобы еще и дубликатов не было. код пишется для программистов, а не для машины и чистота и читабельность, а главное поддерживаемость и отказоустойчивость важнее скорости исполнения
Не понял что тут "питоновского", на c# тоже самое со словарями делают, но вообще да - словарь так используют. Опять же, я не питонист, но не редко есть необходимость использовать Group()/GroupBy() (уверен, в питоне тоже такое есть), т.к. чаще всего соблюдение уникальности требуется при "собирании" объектов по одному признаку. Например, подсчёт суммы продаж из разных документов для каждой уникальной номенклатуры, реализации которых встречаются за период в БД.
Ранее, до версии Python 3.6, словари в Python не гарантировали сохранение порядка. В этом случае, если было важно сохранить порядок элементов, использовался специальный тип словаря collections.OrderedDict
И сиди потом за такими умниками вдупляй чего они там насокращали... Имхо, код должен быть читабельный, сразу, без гениальных финтов в 1 строку которые потом глаз режут.
@@PythonGuru_ Извиняюсь за неполноту комментария. Просто я привык видеть шортсы от другого канала, если не ошибаюсь, тоже по пайтону. Скорее всего, говоря о матах в гайдах(в более нижнем комментарии) отсылают именно на этого ютубера. В своих видео он и, мною сказанную, фразу тоже говорит. :D
Можно вопрос 🙋🏻♂️ Нах…я это все ? Чтоб код в коде удалять .. я вот никогда не понимал для чего это всё делается ? Нельзя сразу написать то, что тебе нужно ?
Можно, но вы не всегда пользуйтесь своим кодом, это во первых, во вторых вы можете хранить данные в списке, а потом вдруг надо получить что-то типа описанного. разные бывают случаи, поэтому и предусмотрены варианты приведения одного типа к другому, для выполнения какого то специфического действия
я так понимаю, это C# или Java. Не знаю как в этих языках, но set в Python имеет сортировку согласно хэшу данных, и не поддерживает сохранение последовательности внесения элемента в коллекцию
Пф, чел, ты чего?!?! Отсортируй массив быстрой сортировкой, а потом удаляешь элемент если он повторяет предыдущий и будет тебе счастье, сложность программы будет всего log(n) + n
fromkeys() - метод класса dict, который создаст и вернет нам обьект типа dict с ключами из итерируемого обьекта, который мы передали в качестве аргумента
Я занимаюсь пайтоном всего, ничего, но есть всего две комманды, которые можно написать друг ппод другом и будет и последовательность и удалённые лишние элементы. Но тут таааааак услоднили
много памяти потребуется для такой ерунды. да и под капотом всех этих методов по сути те же циклы что поднимает сложность алгоритма практически до х3, самый простой и эффективный метод это перебор в цикле с проверкой элемента на вхождение.
чего я все время замеряю )
давайте код и замеры )
В данном случае я не замерял, что под капотом - не обязательно, что перебор. Возможно какая-то более разумная реализация. сокращающая кол-во иттераций.
Потом, это возможно си реализация, которая может быть на порядок быстрее, чем мы циклом побежим пайтоном.
Куча Но.
Еще раз, я лично не замерял, утверждать ничего не могу, но реально любопытно, если вы замерите и поделитесь
Может оказаться, что вы и не правы )
И да, я это предложил как вариант, а не единственно правильное решение
@@PythonGuru_ да даже без замеров видно что тут при вызове создается 2 лишних коллекции, причем вы сами их и упоминаете. когда это массив с большим набором данных, условный курс валюты за несколько лет, то это съест очень много ресурсов. в идеале тут вообще бы без доп памяти реализация должна быть, это при условии что мы не работаем с иммутабельными данными
я ж не спорю, просто интересно замеры увидеть. Чисто любопытно
@@PythonGuru_ в принципе код у вас есть во всех вариациях, можете провести исследование и выложить еще одно видео с результатами)
memory_profiler вроде как позволяет удобно делать замеры)
Только нужно генерировать данные на 1000+ элементов, иначе разница может быть в райне погрешности
мемори профайлер не особо точный, на 1000 точно не увидим ) Лень, так хотелось чтобы кто-нибудь, а я с умным видом поумничал в комментах)
Я не воспринимаю гайды без мата.
на людях не матерюсь )
how about bim bim bam bam?
УДАЛЯЕМ ДУБЛИКАТЫ БЛЯТЬ!!!!
😂
PYTHON BLYAT
А где начальное "БЛЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯДЬ!"
?
Это же другой канал)) но всегда угараю с этих видосов, которые начинаются со слова на букву б. Держу в курсе!
@@PythonGuru_есть канал тоже про яп, и он там эмоционально с матом рассказывает))
отсылка на канал python is trash вроде, не помню название, он преподносит гайды по разным языкам программирования в шуточном формате и с очень громким микрофоном, это делает ещё смешнее@@PythonGuru_
А как же бим бим бам бам😭😭😭?
это который?
я тоже думаю это как гайд по python, и никто на меня не кричит😢
Бим бим бам бам.
👀
Самый лучший способ это перетирать повторения ксором, и это можно сделать всего за 1 прогон циклом
Я уже приготовился к: списки в Пайтон это изи!
Убавил звук)
а вот так
Так вот откуда эти гениальные решения, которые потом через год сидишь, и думаешь, нахуя козе баян
👀
Обычно через год сидишь и думаешь "Какой кретин это написал?! А, бл**, это же я"
Было бы классно, если ещё в видео рассказывали про ассимптотическую сложность по времени и по памяти
Для шорта это уже перебор будет, там ограничение минута
@@PythonGuru_не уверен, было похоже на рофл.
Какой спокойный и умный автор, пойду посмотрю другие ролики, и маме покажу!
🥹
1. Нет гарантии, что пары ключей будут иметь тот же порядок, что и исходные данные. Будет верно для малых количеств, но если более порога сегментирования, очередность не гарантируется.
2. dictionary на основе бинарного дерева, т.е. сложность O(N*log(N)), значит можно найти быстрее способ.
3. Используется промежуточный контейнер для заполнения результирующего списка.
Понимаю, что это питон, лучше обрабатывать пакетами. На плюсах создал бы сет в стеке, в качестве проверочного, и выходной вектор. Сет в конце прибивался бы. Сложность O(n). По памяти меньше от предложенного в видео, за счет того, что не храним пару, а только значение.
будут иметь тот же порядок
@@PythonGuru_вот это аргумент, это когда объект стал гарантом последовательности ключей? Это как раз массив этим гарантом и является
1. Уже есть, но с какой версии - не помню. Раньше не было.
2. Неправда, там хэштаблица и никакого логарифма.
3. Без промежуточного контейнера лучше O(n**2) не выйдет, а приведённое решение O(n). Хотя я бы делал с сетом руками.
4. В плюсах сет нифига не на стеке - он выделяет память в куче. И вот как раз там он на основе бинарного дерева, так что O(n*lb(n)).
@@QwDragon 2. Если хэш, смотри п.1.
3. С промежуточным контейнером, это когда индексы массива хранятся в map
4. В плюсах есть аллокатор, куда хочешь туда и храни. Насчет set/map да, но есть и unordered_set/unordered_map.
И получился анонимный алгоритм, который нужно интерпретировать в голове, чтобы понять что он делает. Хотя бы в функцию/метод с говорящим названием вынесли бы
да вроде все на ладони
А чем генератор плох? Он быстрее цикла. Простой синтаксис. Информативен.
никто не сказал, что генератор плох )
Явное лучше неявного. А что мешает использовать генератор списоков? Ещё и работает быстрее цикла
Полезнее канала не видел!
.keys() здесь не обязателен
можно, но для информативности, я и оставил чтобы явнее было, что именно делаем на каждом шаге
Необязателен, но по pep8 лучше оставить.
"Явное лучше неявного"
Fromkeys() по идее выдает пары ключ_значение ( в данном случае значение для всех ключей будет None), а Keys() выдаст именно ключи
@@user-ne9kg2of1l да, так и будет,однако перевод в list это исправляет
@@user-pw8m9yx9w в этом плане согласен
Не понял, почему это преобразование списка в множество здесь боком выйдет. Даже сейчас пошел проверил, последовательность сохраняется...
сортировка во множестве происходит согласно хэшу данных во множестве. Для целых чисел, хэш целое число, такое же как само число, для дробных, строк, отрицательных - хэш уже высчитывается, и там порядок следования элементов бьется
Смотрю подобные советы, всегда возникает вопрос: загрузка проца и памяти как то учитывается при программировании? В каком случае нагрузка на железо оптимально?
в закрепленном комменте есть инфа
О! В Питоне словари гарантируют порядок полей? 😲
Огонь! Ни чё не понял но бля пипец как интересно😂😂😂 Супер объяснение!!!
👍
Все нормально объяснил, целых 3 способа тебе назвал, решения проблемы
В словаре не гарантируется порядок ключей, вроде.
seq = [seq[i] for i in range(len(seq)) if i == seq.index(seq[i])]
до 3.7 версии, после 3.7, включая, все ок
А что это за программа, гле сразу видно результат?
А на питоне нет linkedhashset как в джава?
Разве ключи в словаре сохраняют порядок?
А чем обычный способ через цикл плох-то?
Блин, народ, вы автора попутали XXXDDDDDD
Одна из причин по которой меня раздражают питонщики, так это то, что они пытаются всё записать в одной строке, из-за чего читаемость кода падает
да нет, не соглашусь
@@PythonGuru_ просто на том же codewars лучшие решения задачи на python почти всегда записаны в одну строку кода
Хочется услышать покрывание матом питон от циферок и буковок но это не на этом канале ((
чем вам пайтон так не угодил?
@@PythonGuru_ да нет просто на одном канале смешные видео про то как чел орёт и рассказывает про Пайтон если что называется python is trash
не видел, надо будет глянуть )
что-то очень жестко…
@@PythonGuru_ XD
Прикольно, но мне кажется, что это намного сложнее читать, и это точно не лучше по ассимптотике
когда не знаешь стандартных методов, то да. А если знаешь, то нет
Закидываешь это в функцию, называешь removeDuplicates. Теперь и читать проще, и детали реализации скрыты
Асимптотика линейная, как и у сета. Возможно, сет эффективнее, но в случае питона, где вызов встроенного метода работает быстрее, чем такой код на питоне, уже не факт.
@@QwDragonвстроенное преобразование будет быстрее, так как тут обычный аналог HashSet, а в случае с со словарём LinkedHashSet там расположен под капотом.
Я уж приготовился слышать "БЩДЗБЗЬЗ, ПАЙТОН БЛЯТЬ", а потом понял что это другой канал
а вот так
Если пользоваться python версии старше чем 3.8 там данные хранятся не в той же последовательности, что добавляются в словарь, и тогда этот метод не сработает, я правильно понимаю?
с 3.7 все хранится, как поместили
Проще говоря подключаем Словарь для того чтобы по его примеру удалить повторения букв. Сравнение и удаление. 😮 а если нет словаря? Не на что опереться?
это просто один из вариантов решения данного случая. и как может не быть словаря, если мы его можем создать? Кто нас в этом ограничивает?
как по мне проще циклом пройти зная сколько пайтон тянет лишних переменных итп за обой
Это вообще возможно всё выучить?)
А на что направлен посыл, в экономии сточек кода или скорости его работы в конечном результате?
и скорость и подход
если нужна скорость работы, питон лучше вообще не использовать.
Гениально 😂
💪
Подскажите в какой оболочке происходит программирование?
Только начинаю учить Питон 😊
Рекомендую, от слова очень
посмотрите эти два видео, и обучение питону пойдет намного проще
ua-cam.com/video/XGYxd2eUA9c/v-deo.htmlsi=2F47XsyqSu9MRnPg
ua-cam.com/video/rjINFaXOmdE/v-deo.htmlsi=lXkzrl2o3_1cYOCq
Vim сила все остальное могила
Не воспринимаю видео по питону без слов : «python блять»!
@@user-my6zq6tm2r vim +python ☠️
@@qlfy9359бим бим бам бам
Ordered set - не, не слышали
хэш таблица в помощь сынок
потенциально первые 2 будур работать быстрее, и более информативны
С чего это вдруг они быстрее будут работать?
Если интересно, я закрепил коммент. Там приведен тест.
@@PythonGuru_ окей, согласен что, второй медленее, так как там сложность Н квадрат. но в зависимости от количества прдпологаемых записей он будет предпочтителее, так как имеет большую гибкость и читабельность.
но если важно сохронение порядка и количество записей будет очень небольшое, то последний вариант будет предпочтителен. но только в этом случае. потому что в последнем варианте выполяется несколько операций, вместо одной set(). а случаев, когда тебе нужно получить список не изменяя порядка, на моей практике наверное ниразу не было. да так, чтобы еще и дубликатов не было.
код пишется для программистов, а не для машины и чистота и читабельность, а главное поддерживаемость и отказоустойчивость важнее скорости исполнения
Не понял что тут "питоновского", на c# тоже самое со словарями делают, но вообще да - словарь так используют. Опять же, я не питонист, но не редко есть необходимость использовать Group()/GroupBy() (уверен, в питоне тоже такое есть), т.к. чаще всего соблюдение уникальности требуется при "собирании" объектов по одному признаку. Например, подсчёт суммы продаж из разных документов для каждой уникальной номенклатуры, реализации которых встречаются за период в БД.
👀
Ну надо говорить, что это работает только после определенной версии питона.
да 5 лет как уже так
можно использовать класс OrderedDict
можно
Очень круто, спасибо!
пожалуйста
А что за IDE, вроде ячейки как в jupyter'е а стиль на VS Code похож. Если кто знает подскажите, пожалуйста.
vscode с jupyter расширением.
откройте ipynb в vscode, если расширение не стоит, vscode предложит установить
@@PythonGuru_ Спасибо большое)
в JS последовательность не теряется ) [...new Set(str)] - и всё
со строковыми данными тоже?
@@PythonGuru_ с любыми.
Хорошо)
👌
Суупер
👌
Продолжайте
👀
Python не гарантирует порядок элементов в словаре. Хоть реализация в cpython сохраняет порядок, полагаться на это не стоит
с 3.7 гарантирует. а это уже 5 лет как.
Ранее, до версии Python 3.6, словари в Python не гарантировали сохранение порядка. В этом случае, если было важно сохранить порядок элементов, использовался специальный тип словаря collections.OrderedDict
в какой программе вы работаете?
vscode + jupyter notebook
Понравилось.
👍
А ГДЕ БИМ БИМ БАМ БАМ
Круто. А если нужно удалить каждое вхождение дубликата, можно это сделать без цикла?))
вопрос, что подразумевается сделать без цикла и что именно, это не то же самое что я показал?
Дайте больше инфо, я честно, не догнал вопрос )
Можешь Counter использовать, и оставить только значения со счётчиком равным 1.
Может и короче, только код этот сам потом через полгода не поймёшь.
Было бы классно если бы рекомендации мне не подсовывали нахер мне не нужный питон
питон расстроился от таких речей (
А в словаре гарантируется порядок?
с версии 3.7, до этого нет. В это считай 5 лет
Ага только ключи словаря могут идти в рандомном порядке
после версии 3.7 - нет
А разве в множество нельзя превратить?
если хотим сохранить последовательность, то нет. Множества имеют сортировку согласно хэшу значений
Все просто но до него еще нужно додуматс
практика, все со временем приходит )
Seq = [i for i in seq if i not in seq]
Только результат достигнут за счет аналогичных функций просто встроенных в язык....
как бы это основа ООП…
а нельзя список перевернуть, а потом использовать на нем set() и перевернуть еще раз
как то не уловил рабочей логики
по твоей логике вообще не надо заморачиваться и сделать в одну строку newseq = ['c','b','a']
Однострочник детектед
йес, оф корс
а LinkedHashSet нету в питоне?
это я понимаю в Java такое присутствует. В питоне такого нету
И сиди потом за такими умниками вдупляй чего они там насокращали...
Имхо, код должен быть читабельный, сразу, без гениальных финтов в 1 строку которые потом глаз режут.
Это может попасть в собеседовании?
не часто, но возможно.
@@PythonGuru_ было бы очень круто, если появились видео с разбором заданий из собеседований
Сахарок
А где "бим бим бам бам"?
это о чем?
@@PythonGuru_ Извиняюсь за неполноту комментария. Просто я привык видеть шортсы от другого канала, если не ошибаюсь, тоже по пайтону. Скорее всего, говоря о матах в гайдах(в более нижнем комментарии) отсылают именно на этого ютубера. В своих видео он и, мною сказанную, фразу тоже говорит. :D
понял ) спс, за разьяснение
Можно вопрос 🙋🏻♂️
Нах…я это все ? Чтоб код в коде удалять .. я вот никогда не понимал для чего это всё делается ? Нельзя сразу написать то, что тебе нужно ?
Можно, но вы не всегда пользуйтесь своим кодом, это во первых, во вторых вы можете хранить данные в списке, а потом вдруг надо получить что-то типа описанного.
разные бывают случаи, поэтому и предусмотрены варианты приведения одного типа к другому, для выполнения какого то специфического действия
лучше бы такты процессора экономили как строчки, ящеры окаянные
это на ассемблер надо переходить
@@PythonGuru_на В КРЕСТ КРЕСТ
Ты бы сначала асимптотику посчитал, а потом не писал бред.
seq = list(set(seq))
множество убьет порядок, а нас его как раз надо оставить
@@PythonGuru_ Я тестировал, не убирает
Это Java?
Это питон.
А на ум пришла фраза из песни Зверей )
Это феррари, нет - это бентли
@@PythonGuru_ бывает 😁
@@PythonGuru_ спасибо за ответ
set ()
с сохранением последовательности. set убьет ее.
Не увидел про последовательность, извиняюсь.)@@PythonGuru_
hashset? Неееее
я так понимаю, это C# или Java. Не знаю как в этих языках, но set в Python имеет сортировку согласно хэшу данных, и не поддерживает сохранение последовательности внесения элемента в коллекцию
И каким образом HashSet сохранит порядок? В питоне он и есть.
new = [x for x if x not in seq]
👀
👀
Ничего не выйдет если у вас python 3.5.😂
и с 3.6 тоже, и со всеми версиями, что до 3.7
Найди пожалуйста , девушку для озвучки , спасибо .
зачем? )
@@PythonGuru_ извините конечно за вопрос на вопрос , но что вы вообще делаете ?
в смысле? не совсем ясен вопрос
@@PythonGuru_ я хочу сказать , вы делаете медиа контент , верно ?
когда есть время, делаю. Это больше хобби
Круто, конечно, но процедурно.
вот так
Скорее функционально. Или методично?
Пф, чел, ты чего?!?!
Отсортируй массив быстрой сортировкой, а потом удаляешь элемент если он повторяет предыдущий и будет тебе счастье, сложность программы будет всего log(n) + n
а вы отсортируйте и замерьте скорость.
А как ты отсортированному массиву обратно старый порядок вернёшь? К тому же, линейный алгоритм эффективнее.
@@QwDragon Ну лаааадно, признаю, что забыл про часть условия
кал
интересный комментарий
Горе учитель, в словарях порядок может сломаться, тупо даже от запуска одной программы несколько раз
да что вы. До пайтона 3.7 - порядок не поддерживался, с 3.7 порядок не меняется.
Что еще про меня скажете? Кроме горе учителя?
И никто никогда не объясняет, что это за dict с точкой )
fromkeys() - метод класса dict, который создаст и вернет нам обьект типа dict с ключами из итерируемого обьекта, который мы передали в качестве аргумента
Я занимаюсь пайтоном всего, ничего, но есть всего две комманды, которые можно написать друг ппод другом и будет и последовательность и удалённые лишние элементы. Но тут таааааак услоднили
наоборот, упростили
Но главное никому их не говорить?
придумываем проблемы где их не существует. нубы хавают видимо
где проблема?