С кортежами это работает иначе, я так понимаю это из-за того что () могут также изменять порядок действий, а если бы этой фичи не было возникали бы множество проблем к примеру в мат выражениях?
Мне бы эти знания, да пару месяцев назад... хотя найти и самому во всем разобраться будет все же полезней. В любом случае несколько моментов понял лучше, а с чем-то еще не сталкивался и в будущем уже буду знать как их обойти. Спасибо!
Все очень чётко и по делу. Здорово! Но очень быстро, иногда картинка с кодом пропадает, когда диктор ещё не договорил. Приходится многократно перематывать. Зачем такая спешка?
3:09 dict - не ключевое слово. Ключевые слова - конструкции вроде if, True, def и другие, а dict - класс встроенного модуля builtins. Его можно импортировать через import
6:58 Ещё если лень юзать dict.get (а я из таких) можно преобразовать имеющийся словарь в defaultdict, он есть в модуле collections: Нашёл весьма интересный и удобный способ это сделать: >>> d = dict(a=5, b=7) >>> d {'a': 5, 'b': 7} >>> d['a'] 5 >>> d['c'] Traceback (most recent call last): File "", line 1, in KeyError: 'c' >>> d['c', None] Traceback (most recent call last): File "", line 1, in KeyError: ('c', None) >>> d['c'] else None File "", line 1 d['c'] else None ^^^^ SyntaxError: invalid syntax >>> help(dict) >>> from collections import defaultdict >>> >>> d = defaultdict(lambda: None, d) >>> d defaultdict(, {'a': 5, 'b': 7}) >>> d['c'] >>> type(d['c']) >>>
то есть тебе питон явно и ванильно говорит "смотри, у меня есть простой и безопасный метод get", но ты предлагаешь задействовать ресурсы на дополнительное преобразование да еще и с какими-то неочевидными лямбда-функциями? )
Как обойти try except за это спасибо! Я пару раз спрашивал в различных местах, не получил ответа. Словари - это мой рабочий инструмент. При помощи них я делаю свою функциональщину. Ключ - название объекта, а в значении сам объект. Таким образом я обхожусь без ООП. У меня есть GUI либа, если заглянуть в кишки, там этих try except просто море, так как пользователь может указать какие-то параметры, а какие-то не указывать. Я всё пытался избавиться от try except, чтобы код выглядел чище.
я вот пришел на проект к таким же молодцам, которые обходятся без ООП, все на словарях, мрак сплошной, поддержка крайне дорогая и сложная, так что лучше используй ООП и не надо говнокодить
2:23 Функцию можно использовать как ключ, хотя она вроде как является изменяемым типом данных можно поменять аннотации, значения по умолчанию, добавлять новые атрибуты, даже сам код поменять можно, однако функцию можно использовать как ключ словаря.
Одно что я заметил, в условном операторе и циклах использовать конструкцию с методом словаря типа dict.keys() нет смысла, так как при подобных операциях и так мы получим ключи словаря, практически единственный момент где нужен этот метод, так это при выводе в print(dict.keys())
Годнота, спасибо за контент) Если будет не лень или вдруг уже делал, то было бы не плохо узнать про стандартные библиотеки Тот же collection или itertool
Не знаю на сколько часто это используется, но в качестве значений в словарях можно хранить не только данные, но и ссылки на код (функции, методы) PS автору, если поработаешь чуток с голосом, то будет гораздо приятнее слушать. Сейчас он звучит немного натужно. Как будто бы ты куда-то очень торопишься, а мы тебя задерживаем. Это не хейт, просто рекомендация.
2:10 "Ключём словаря может быть только неизменяемый тип" Почему у тех, кто не разобрался в теме такая мания кого то учить? Ключём словаря может быть любой хешируемый объект
Добрый день, постоянно смотрю ваши видео, подскажите пожалуйста , есть в списке 1 миллиард чисел но только 1 и 0. Каким методом быстрее всего подсчитать сумму всех 1. Пробовал словарем, но все равно ругается на длительное выполнение программы.
Ну наконец то... значит теперь словарь упорядочный массив. То то я непонимал почему рор возвращал последнее значение, а вроде бы должен случайное. Скиллбокс!!! , если вы поняли о чем я.
16:54 Не правильно. Ordered dict надо делать из списка пар кортежей ключ-значение а не из обычного словаря. Ordered dict, конечно запомнит последовательность, но он примет в качестве аргумента обычный словарь, который не помнит. Надо было писать так: collections.OrderedDict([("a",1),("b",2),("c",3)]) 17:17 Да ты чо? А попробуй запустить свой код.
6:58 А я раньше делал dict['key'] if 'key' in dict else None А можно как-то немного модифицировать штатный словарь для вызова без dict.get? Я просто ленивый 😅
Нашёл весьма интересный и удобный способ это сделать: >>> from collections import defaultdict >>> d = {'foo': 123, 'bar': 456} >>> d['baz'] Traceback (most recent call last): File "", line 1, in KeyError: 'baz' >>> d = defaultdict(lambda: -1, d) >>> d['baz'] -1
Использование get с дефолтным параметром ведет к хитрым багулинам. Допустим, я получил данные в виде словаря с некоторого источника и действительно не уверен, что конкретный ключ в словаре присутствует. Пишу: name = data_dict.get('name', '') И далее по коду работаю с name как со строкой. И гарантированно ловлю ошибку, если вдруг источник мне вернул словарь, где ключ 'name' есть, но значения у него нет. Метод get вытащит этот несчастный None и все сломает. Более безопасно писать: name = data_dict.get('name') or ''
Что делать, если нужно добавить к существующему ключу с его значением дополнительное значение? То есть не просто обновить и затереть прошлое значение ключа, а добавить дополнительное значение, и так несколько раз. Например, есть объекты которые содержат Жанр, Имя Автора и Название его книги, и нужно сформировать вложенный словарь. {"Название жанра": {"Имя автора": ["Название книги"], {"Имя автора": ["Название книги", "Название книги"]}}} Если я просто начну обновлять значение я затру то что занес ранее. Пф как мог старался донести мысль))
не знаю актуально ли спустя 7 месяцев отвечать на комментарий, но может кому-то все же будет полезно мы используем для этого тот же get d['ключ'] = d.get(ключ, []) + [значение] получается у нас будет создан ключ в котором значение - пустой словарь, и если мы идет циклом for , то на каждой итерации можем добавлять в список новое значение
1. операция deepcopy медленнее 2. приходится выделять лишнюю память под данные если словари маленькие особой разницы не заметите, но на собеседовании могут спросить, да и если данных много и там будут ещё какие-то тяжелые объекты то можно прикурить
ага, а еще можно было через zip() сразу 2 списка взять а не говнокодить {key: value for key, value in zip(list_1, list_2, strict=True)} или же просто dict(zip(list_1, list_2, strict=True))
Может кому-то пригодится: dd = defaultdict( dict ) dd['a']['b']['c'] = 3 Defaultdict принимает любую функцию, а не только и dict в данном случае всегда будет продуцировать новый словарь Так можно строить деревья произвольной глубины и ветвлений и это мегаполезная функция в том числе и в реальной работе.
млять, я не успеваю, только начинаешь понимать какую тему, а уже на 3 темы вперёд ушло 😵💫 очень плотно и быстро, без пауз и пересмотров никак. консолька слишком высокая, куча лишней инфы, при этом прячется код который был до этого показан 100 микросекунд да и рабочее пространство на фулскрин хорошо бы, к чему эта "красота" вокруг съедающая полезное место когда его и так нехваатет
из за такой скорости, его приятно смотреть тем, кто уже знает язык, но подзабыл, допустим год не пользовался. а еслиб разсусоливал, то врятли бы смотрел.
(4000) - не является кортежем, что бы сделать кортеж с одним элементом, нужно добавить запятую после элемента вот так: (4000,)
С кортежами это работает иначе, я так понимаю это из-за того что () могут также изменять порядок действий, а если бы этой фичи не было возникали бы множество проблем к примеру в мат выражениях?
Да, ошибочка вышла)
@@zproger в демонстрации того, что кортеж может быть ключом, точно такая же ошибка. Но да кортеж может быть ключом.
Тоже хотел это написать, без запятой это обычная строка
можно и без скобок
ух, круть! Лайк за фишечки от СЕООНЛИ
Благодарю
Мне бы эти знания, да пару месяцев назад... хотя найти и самому во всем разобраться будет все же полезней. В любом случае несколько моментов понял лучше, а с чем-то еще не сталкивался и в будущем уже буду знать как их обойти. Спасибо!
Спасибо большое за знания, дай Бог здоровья!
Спасибо =))
Методы .get() и .update() представляются полезными, особенно в циклах.
Согласен
Спасибо большое! Как новичок говорю что это годный контент!
😉
Полезно и классно , лайк.
Благодарю!
Все очень чётко и по делу. Здорово! Но очень быстро, иногда картинка с кодом пропадает, когда диктор ещё не договорил. Приходится многократно перематывать. Зачем такая спешка?
Хорошее видео, спасибо!
😉
Интересно. Спасибо за видео
😉
Супер канал, спасибо!
😉
3:09 dict - не ключевое слово.
Ключевые слова - конструкции вроде if, True, def и другие, а dict - класс встроенного модуля builtins. Его можно импортировать через import
17:55 😂😅, а я недавно копался в collections за этим..
Спасибо за видос!
=))
6:58 Ещё если лень юзать dict.get (а я из таких) можно преобразовать имеющийся словарь в defaultdict, он есть в модуле collections:
Нашёл весьма интересный и удобный способ это сделать:
>>> d = dict(a=5, b=7)
>>> d
{'a': 5, 'b': 7}
>>> d['a']
5
>>> d['c']
Traceback (most recent call last):
File "", line 1, in
KeyError: 'c'
>>> d['c', None]
Traceback (most recent call last):
File "", line 1, in
KeyError: ('c', None)
>>> d['c'] else None
File "", line 1
d['c'] else None
^^^^
SyntaxError: invalid syntax
>>> help(dict)
>>> from collections import defaultdict
>>>
>>> d = defaultdict(lambda: None, d)
>>> d
defaultdict(, {'a': 5, 'b': 7})
>>> d['c']
>>> type(d['c'])
>>>
Немного говнокод
то есть тебе питон явно и ванильно говорит "смотри, у меня есть простой и безопасный метод get", но ты предлагаешь задействовать ресурсы на дополнительное преобразование да еще и с какими-то неочевидными лямбда-функциями? )
В конце видео было про это))
Это было познавательно. Спасибо!
{"Просто": "супер"}
=)
deepcopy зачтено, пасиба
Как обойти try except за это спасибо! Я пару раз спрашивал в различных местах, не получил ответа. Словари - это мой рабочий инструмент. При помощи них я делаю свою функциональщину. Ключ - название объекта, а в значении сам объект. Таким образом я обхожусь без ООП. У меня есть GUI либа, если заглянуть в кишки, там этих try except просто море, так как пользователь может указать какие-то параметры, а какие-то не указывать. Я всё пытался избавиться от try except, чтобы код выглядел чище.
я вот пришел на проект к таким же молодцам, которые обходятся без ООП, все на словарях, мрак сплошной, поддержка крайне дорогая и сложная, так что лучше используй ООП и не надо говнокодить
Попробуйте pydantic или аналоги, жизнь мб красками заиграет)
Мега крут, поделись темой VSCode :)
Dracula
кортЕж
кортЕжа
кортЕжей
кортЕжами
да 😎
Порадовало что бы вывести табличку в консоль скачайте библиотеку на 100 слишнем метров)))
2:23 Функцию можно использовать как ключ, хотя она вроде как является изменяемым типом данных можно поменять аннотации, значения по умолчанию, добавлять новые атрибуты, даже сам код поменять можно, однако функцию можно использовать как ключ словаря.
ключом словаря может быть любой хэшируемый объект. То есть тот, у которого есть метод hash, так правильнее отвечать
Одно что я заметил, в условном операторе и циклах использовать конструкцию с методом словаря типа dict.keys() нет смысла, так как при подобных операциях и так мы получим ключи словаря, практически единственный момент где нужен этот метод, так это при выводе в print(dict.keys())
13:48 👍👍👍
Привет, го рубрику с написанием программ с пояснениями ?
Годнота, спасибо за контент)
Если будет не лень или вдруг уже делал, то было бы не плохо узнать про стандартные библиотеки
Тот же collection или itertool
Благодарю. А не подскажете что за линукс у вас стоит ?
ZorinOs
Не знаю на сколько часто это используется, но в качестве значений в словарях можно хранить не только данные, но и ссылки на код (функции, методы)
PS автору, если поработаешь чуток с голосом, то будет гораздо приятнее слушать. Сейчас он звучит немного натужно. Как будто бы ты куда-то очень торопишься, а мы тебя задерживаем. Это не хейт, просто рекомендация.
Часто используется. В тех же мапперах
Сделай видос, Деобфускация PyArmor
2:55 [3] Кортежем это станет, если после "port" добавить запятую. ("port") == "port", а ("port",) это кортеж
16:01 думаю что по материалу видео можно было сделать так:
dict(*zip(iters, values))
Так как у Вас выдает ошибку (Python 3.12.3). А вот так работает: dict(zip(iters, values))
Классно! Очень полезно
😉
Автор, какая у тебя система?
ZorinOS
2:10 "Ключём словаря может быть только неизменяемый тип" Почему у тех, кто не разобрался в теме такая мания кого то учить? Ключём словаря может быть любой хешируемый объект
11:02 🤔, может и на это есть что-то в collections?
Там много чего интересного)
Добрый день, постоянно смотрю ваши видео, подскажите пожалуйста , есть в списке 1 миллиард чисел но только 1 и 0. Каким методом быстрее всего подсчитать сумму всех 1. Пробовал словарем, но все равно ругается на длительное выполнение программы.
через counter
ключами являются не неизменяемые типы, а хэширумые данные
Ну наконец то... значит теперь словарь упорядочный массив. То то я непонимал почему рор возвращал последнее значение, а вроде бы должен случайное. Скиллбокс!!! , если вы поняли о чем я.
вместо итерации по dict.keys() можно итерироваться сразу по словарю, результат будет такой же.
2:43 ток запятую забыл поставить, чтобы кортеж сделать. А так получились просто скобки
Точно, не обратил на это внимание
@@zproger в любом случае спасибо за видео. Не знал, что метод get не возвращает ошибку Keyerror
В данном видео ни один кортеж не пострадал :)
а на какой минуте фишки диктов?
Словарь, он же ассоциативный массив, он же объект, он же map или mutable map
а разве это не dict comprehension? (я про генератор)
Да, я просто учился по книгам где это называют "генераторами", поэтому привык тоже так называть)
16:54 Не правильно.
Ordered dict надо делать из списка пар кортежей ключ-значение а не из обычного словаря.
Ordered dict, конечно запомнит последовательность, но он примет в качестве аргумента обычный словарь, который не помнит.
Надо было писать так:
collections.OrderedDict([("a",1),("b",2),("c",3)])
17:17 Да ты чо? А попробуй запустить свой код.
6:58 А я раньше делал dict['key'] if 'key' in dict else None
А можно как-то немного модифицировать штатный словарь для вызова без dict.get? Я просто ленивый 😅
О, а можно ли указать default при вызове через dict['key']?
Нашёл весьма интересный и удобный способ это сделать:
>>> from collections import defaultdict
>>> d = {'foo': 123, 'bar': 456}
>>> d['baz'] Traceback (most recent call last): File "", line 1, in KeyError: 'baz'
>>> d = defaultdict(lambda: -1, d)
>>> d['baz'] -1
Может оказаться полезным: метод dict.keys возвращает объект, поддерживающий операторы для множеств.
Использование get с дефолтным параметром ведет к хитрым багулинам. Допустим, я получил данные в виде словаря с некоторого источника и действительно не уверен, что конкретный ключ в словаре присутствует. Пишу:
name = data_dict.get('name', '')
И далее по коду работаю с name как со строкой. И гарантированно ловлю ошибку, если вдруг источник мне вернул словарь, где ключ 'name' есть, но значения у него нет. Метод get вытащит этот несчастный None и все сломает.
Более безопасно писать:
name = data_dict.get('name') or ''
👍
😉
6:57 Если какой-то элемент которое вы хотите получить имеет None значение...
😉
Неизменяемость ключей нужна для их хэшируемости, а не для того, о чем сказано в видео
Что делать, если нужно добавить к существующему ключу с его значением дополнительное значение? То есть не просто обновить и затереть прошлое значение ключа, а добавить дополнительное значение, и так несколько раз. Например, есть объекты которые содержат Жанр, Имя Автора и Название его книги, и нужно сформировать вложенный словарь. {"Название жанра": {"Имя автора": ["Название книги"], {"Имя автора": ["Название книги", "Название книги"]}}} Если я просто начну обновлять значение я затру то что занес ранее. Пф как мог старался донести мысль))
не знаю актуально ли спустя 7 месяцев отвечать на комментарий, но может кому-то все же будет полезно
мы используем для этого тот же get
d['ключ'] = d.get(ключ, []) + [значение]
получается у нас будет создан ключ в котором значение - пустой словарь, и если мы идет циклом for , то на каждой итерации можем добавлять в список новое значение
@@ИннаЛиксакова-о4н ага, а еще есть defaultdict(list). За конкатенацию по головке никто не погладит
куда ты так спешишь?
Вроде не новичок, но то, что OrderedDict можно не использовать начиная с 3.7, узнал только сейчас.
Зачем чёрные полосы(letterbox) ?((
какой это дистрибутив линукс?
Zorin OS
В принципе, можно завести себе практику вообще не использовать для изменяемых объектов copy() а использовать для себя по умолчанию deepcopy()
1. операция deepcopy медленнее
2. приходится выделять лишнюю память под данные
если словари маленькие особой разницы не заметите, но на собеседовании могут спросить, да и если данных много и там будут ещё какие-то тяжелые объекты то можно прикурить
я не до конца понимаю, что делает метод get?
Извлекает значение по ключу из словаря.
Аналогично будет если написать a["name"],
просто get это делает без ошибки KeyError.
@@zproger спасибо большое!
15:45 - мозг сломался! как так все в одну строку заработало?
ага, а еще можно было через zip() сразу 2 списка взять а не говнокодить
{key: value for key, value in zip(list_1, list_2, strict=True)}
или же просто dict(zip(list_1, list_2, strict=True))
метод setdefault(key, default)
Может кому-то пригодится:
dd = defaultdict( dict )
dd['a']['b']['c'] = 3
Defaultdict принимает любую функцию, а не только и dict в данном случае всегда будет продуцировать новый словарь
Так можно строить деревья произвольной глубины и ветвлений и это мегаполезная функция в том числе и в реальной работе.
Эта херня не работает.🤪
Может кто-нибудь объяснить, что тут происходит? 15:40
млять, я не успеваю, только начинаешь понимать какую тему, а уже на 3 темы вперёд ушло 😵💫 очень плотно и быстро, без пауз и пересмотров никак.
консолька слишком высокая, куча лишней инфы, при этом прячется код который был до этого показан 100 микросекунд
да и рабочее пространство на фулскрин хорошо бы, к чему эта "красота" вокруг съедающая полезное место когда его и так нехваатет
из за такой скорости, его приятно смотреть тем, кто уже знает язык, но подзабыл, допустим год не пользовался. а еслиб разсусоливал, то врятли бы смотрел.
@@vrabosh даже для таких это слишком, даже междупауз нет
10:47 - ошибка есть
все эти фишкит есть в офф доке, чтение которой занимает меньше 5ти минут
а как обращаться к вложенному словари мы сами должны догадаться?
Отвратительная подача материала... Куда лектор торопиться-то?
Может, со словарями, а не с словарями? Ты робот что ли?
именно)
Отписка за незнание синтаксиса кортежа
Просто забыл запятую поставить, с кем не бывает
Но можете отписываться, никто не держит
Об'єднати списки в словник можна так:
kys=["id","name","grade"]
vals=[343,"vasya",100]
mydict=dict(zip(kys,vals))
>>> mydict
{'id': 343, 'name': 'vasya', 'grade': 100}
Потім заапдейтити можна так
newdict={'sex':'male','age':33}
mydict={**mydict,**newdict}
{'id': 343, 'name': 'vasya', 'grade': 100, 'sex': 'male', 'age': 33}