15 Фишек с СЛОВАРЯМИ Python, которые сделают код лучше

Поделиться
HTML-код
  • Опубликовано: 20 сен 2024

Комментарии • 120

  • @Sapphire12v
    @Sapphire12v 2 года назад +116

    (4000) - не является кортежем, что бы сделать кортеж с одним элементом, нужно добавить запятую после элемента вот так: (4000,)

    • @ОлегШабанов-щ4ь
      @ОлегШабанов-щ4ь 2 года назад

      С кортежами это работает иначе, я так понимаю это из-за того что () могут также изменять порядок действий, а если бы этой фичи не было возникали бы множество проблем к примеру в мат выражениях?

    • @zproger
      @zproger  2 года назад +10

      Да, ошибочка вышла)

    • @forquest8127
      @forquest8127 2 года назад +3

      @@zproger в демонстрации того, что кортеж может быть ключом, точно такая же ошибка. Но да кортеж может быть ключом.

    • @ruden6623
      @ruden6623 2 года назад

      Тоже хотел это написать, без запятой это обычная строка

    • @КузькинДима
      @КузькинДима Год назад +1

      можно и без скобок

  • @seoonlyRU
    @seoonlyRU Год назад +3

    ух, круть! Лайк за фишечки от СЕООНЛИ

    • @zproger
      @zproger  Год назад +1

      Благодарю

  • @Zemchik
    @Zemchik 2 года назад +6

    Мне бы эти знания, да пару месяцев назад... хотя найти и самому во всем разобраться будет все же полезней. В любом случае несколько моментов понял лучше, а с чем-то еще не сталкивался и в будущем уже буду знать как их обойти. Спасибо!

  • @ava11ach
    @ava11ach 2 года назад +5

    Спасибо большое за знания, дай Бог здоровья!

    • @zproger
      @zproger  2 года назад

      Спасибо =))

  • @abyrvalg_
    @abyrvalg_ 2 года назад +11

    Методы .get() и .update() представляются полезными, особенно в циклах.

    • @zproger
      @zproger  2 года назад +1

      Согласен

  • @Alexis-rr3nv
    @Alexis-rr3nv 2 года назад +4

    Спасибо большое! Как новичок говорю что это годный контент!

  • @ruslansanzharov5825
    @ruslansanzharov5825 Год назад +1

    3:09 dict - не ключевое слово.
    Ключевые слова - конструкции вроде if, True, def и другие, а dict - класс встроенного модуля builtins. Его можно импортировать через import

  • @VaeV1ct1s
    @VaeV1ct1s Год назад +1

    2:10 "Ключём словаря может быть только неизменяемый тип" Почему у тех, кто не разобрался в теме такая мания кого то учить? Ключём словаря может быть любой хешируемый объект

  • @rokot
    @rokot 2 года назад +10

    Как обойти try except за это спасибо! Я пару раз спрашивал в различных местах, не получил ответа. Словари - это мой рабочий инструмент. При помощи них я делаю свою функциональщину. Ключ - название объекта, а в значении сам объект. Таким образом я обхожусь без ООП. У меня есть GUI либа, если заглянуть в кишки, там этих try except просто море, так как пользователь может указать какие-то параметры, а какие-то не указывать. Я всё пытался избавиться от try except, чтобы код выглядел чище.

    • @TurboKot1k
      @TurboKot1k 11 месяцев назад

      я вот пришел на проект к таким же молодцам, которые обходятся без ООП, все на словарях, мрак сплошной, поддержка крайне дорогая и сложная, так что лучше используй ООП и не надо говнокодить

    • @ydjin3930
      @ydjin3930 10 месяцев назад

      Попробуйте pydantic или аналоги, жизнь мб красками заиграет)

  • @pestovalexey
    @pestovalexey Год назад

    Все очень чётко и по делу. Здорово! Но очень быстро, иногда картинка с кодом пропадает, когда диктор ещё не договорил. Приходится многократно перематывать. Зачем такая спешка?

  • @yoz75
    @yoz75 2 года назад +2

    Полезно и классно , лайк.

    • @zproger
      @zproger  2 года назад

      Благодарю!

  • @blackcatdevel0per
    @blackcatdevel0per 2 года назад +2

    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'])
    >>>

    • @Pro100Sasha2014
      @Pro100Sasha2014 2 года назад +1

      Немного говнокод

    • @adultart
      @adultart Год назад +2

      то есть тебе питон явно и ванильно говорит "смотри, у меня есть простой и безопасный метод get", но ты предлагаешь задействовать ресурсы на дополнительное преобразование да еще и с какими-то неочевидными лямбда-функциями? )

    • @the_w0nderful43
      @the_w0nderful43 Год назад

      В конце видео было про это))

  • @thenyan6832
    @thenyan6832 3 месяца назад

    Одно что я заметил, в условном операторе и циклах использовать конструкцию с методом словаря типа dict.keys() нет смысла, так как при подобных операциях и так мы получим ключи словаря, практически единственный момент где нужен этот метод, так это при выводе в print(dict.keys())

  • @archyt88
    @archyt88 2 года назад +1

    Интересно. Спасибо за видео

  • @vladimirkorshunov7734
    @vladimirkorshunov7734 Год назад +2

    Не знаю на сколько часто это используется, но в качестве значений в словарях можно хранить не только данные, но и ссылки на код (функции, методы)
    PS автору, если поработаешь чуток с голосом, то будет гораздо приятнее слушать. Сейчас он звучит немного натужно. Как будто бы ты куда-то очень торопишься, а мы тебя задерживаем. Это не хейт, просто рекомендация.

    • @AwakenDrow
      @AwakenDrow Год назад

      Часто используется. В тех же мапперах

  • @yarilo-dev
    @yarilo-dev 2 года назад

    Это было познавательно. Спасибо!

  • @FXUNDPLXGG
    @FXUNDPLXGG 2 года назад +2

    Мега крут, поделись темой VSCode :)

  • @mesteriis
    @mesteriis Год назад +1

    Порадовало что бы вывести табличку в консоль скачайте библиотеку на 100 слишнем метров)))

  • @АндрейИсаков-э4к

    2:55 [3] Кортежем это станет, если после "port" добавить запятую. ("port") == "port", а ("port",) это кортеж

  • @КириллКалита-ч3ж
    @КириллКалита-ч3ж 2 года назад +1

    Хорошее видео, спасибо!

  • @alexeymatveev9031
    @alexeymatveev9031 2 года назад +1

    Супер канал, спасибо!

  • @Shadowfight-z5f
    @Shadowfight-z5f Год назад

    2:23 Функцию можно использовать как ключ, хотя она вроде как является изменяемым типом данных можно поменять аннотации, значения по умолчанию, добавлять новые атрибуты, даже сам код поменять можно, однако функцию можно использовать как ключ словаря.

    • @user-nu3ot7td1j
      @user-nu3ot7td1j Год назад

      ключом словаря может быть любой хэшируемый объект. То есть тот, у которого есть метод hash, так правильнее отвечать

  • @ФдрФфф
    @ФдрФфф Год назад +2

    кортЕж
    кортЕжа
    кортЕжей
    кортЕжами

  • @blackcatdevel0per
    @blackcatdevel0per 2 года назад +1

    17:55 😂😅, а я недавно копался в collections за этим..
    Спасибо за видос!

  • @TheTruepikvic
    @TheTruepikvic 2 месяца назад

    Неизменяемость ключей нужна для их хэшируемости, а не для того, о чем сказано в видео

  • @Alpha_Gamma_Beta
    @Alpha_Gamma_Beta Год назад +1

    deepcopy зачтено, пасиба

  • @ПавелГолубев-п8о
    @ПавелГолубев-п8о 2 года назад +3

    Годнота, спасибо за контент)
    Если будет не лень или вдруг уже делал, то было бы не плохо узнать про стандартные библиотеки
    Тот же collection или itertool

  • @flayers1646
    @flayers1646 2 года назад +1

    Благодарю. А не подскажете что за линукс у вас стоит ?

  • @vld_dmn
    @vld_dmn 3 месяца назад

    ключами являются не неизменяемые типы, а хэширумые данные

  • @adultart
    @adultart Год назад

    Использование get с дефолтным параметром ведет к хитрым багулинам. Допустим, я получил данные в виде словаря с некоторого источника и действительно не уверен, что конкретный ключ в словаре присутствует. Пишу:
    name = data_dict.get('name', '')
    И далее по коду работаю с name как со строкой. И гарантированно ловлю ошибку, если вдруг источник мне вернул словарь, где ключ 'name' есть, но значения у него нет. Метод get вытащит этот несчастный None и все сломает.
    Более безопасно писать:
    name = data_dict.get('name') or ''

  • @ydjin3930
    @ydjin3930 10 месяцев назад

    а на какой минуте фишки диктов?

  • @Zakar-gm2yl
    @Zakar-gm2yl 2 года назад

    Привет, го рубрику с написанием программ с пояснениями ?

  • @blackcatdevel0per
    @blackcatdevel0per 2 года назад +1

    13:48 👍👍👍

  • @lmaootakedh
    @lmaootakedh 2 года назад +1

    6:57 Если какой-то элемент которое вы хотите получить имеет None значение...

  • @ИванВалеев-б1й
    @ИванВалеев-б1й 2 года назад

    вместо итерации по dict.keys() можно итерироваться сразу по словарю, результат будет такой же.

  • @blackcatdevel0per
    @blackcatdevel0per 2 года назад +1

    11:02 🤔, может и на это есть что-то в collections?

    • @zproger
      @zproger  2 года назад

      Там много чего интересного)

  • @artembagachkov933
    @artembagachkov933 2 года назад +1

    {"Просто": "супер"}

  • @awenn2015
    @awenn2015 Год назад

    Словарь, он же ассоциативный массив, он же объект, он же map или mutable map

  • @bot_N666
    @bot_N666 Год назад

    Ну наконец то... значит теперь словарь упорядочный массив. То то я непонимал почему рор возвращал последнее значение, а вроде бы должен случайное. Скиллбокс!!! , если вы поняли о чем я.

  • @ruslansanzharov5825
    @ruslansanzharov5825 Год назад

    16:01 думаю что по материалу видео можно было сделать так:
    dict(*zip(iters, values))

    • @svvonline1
      @svvonline1 24 дня назад

      Так как у Вас выдает ошибку (Python 3.12.3). А вот так работает: dict(zip(iters, values))

  • @cherimolah9493
    @cherimolah9493 2 года назад +2

    2:43 ток запятую забыл поставить, чтобы кортеж сделать. А так получились просто скобки

    • @zproger
      @zproger  2 года назад

      Точно, не обратил на это внимание

    • @cherimolah9493
      @cherimolah9493 2 года назад

      @@zproger в любом случае спасибо за видео. Не знал, что метод get не возвращает ошибку Keyerror

    • @jurissiberian7568
      @jurissiberian7568 2 года назад

      В данном видео ни один кортеж не пострадал :)

  • @metasy_
    @metasy_ 2 года назад +1

    а разве это не dict comprehension? (я про генератор)

    • @zproger
      @zproger  2 года назад

      Да, я просто учился по книгам где это называют "генераторами", поэтому привык тоже так называть)

  • @luispakvard5681
    @luispakvard5681 2 года назад +1

    Об'єднати списки в словник можна так:
    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}

  • @hurrdurrrderp
    @hurrdurrrderp 11 месяцев назад

    Вроде не новичок, но то, что OrderedDict можно не использовать начиная с 3.7, узнал только сейчас.

  • @ooh_no_cringe
    @ooh_no_cringe 10 месяцев назад

    Зачем чёрные полосы(letterbox) ?((

  • @АнимеШняга
    @АнимеШняга 2 года назад

    Сделай видос, Деобфускация PyArmor

  • @luckyme8610
    @luckyme8610 Год назад

    Добрый день, постоянно смотрю ваши видео, подскажите пожалуйста , есть в списке 1 миллиард чисел но только 1 и 0. Каким методом быстрее всего подсчитать сумму всех 1. Пробовал словарем, но все равно ругается на длительное выполнение программы.

  • @stevemantino5961
    @stevemantino5961 2 года назад +1

    Автор, какая у тебя система?

  • @Shadowfight-z5f
    @Shadowfight-z5f Год назад

    16:54 Не правильно.
    Ordered dict надо делать из списка пар кортежей ключ-значение а не из обычного словаря.
    Ordered dict, конечно запомнит последовательность, но он примет в качестве аргумента обычный словарь, который не помнит.
    Надо было писать так:
    collections.OrderedDict([("a",1),("b",2),("c",3)])
    17:17 Да ты чо? А попробуй запустить свой код.

  • @КарлМаркс-ж4у
    @КарлМаркс-ж4у Год назад

    Может кто-нибудь объяснить, что тут происходит? 15:40

  • @minimus91
    @minimus91 2 года назад

    Может оказаться полезным: метод dict.keys возвращает объект, поддерживающий операторы для множеств.

  • @vbncursed
    @vbncursed Год назад +1

    какой это дистрибутив линукс?

  • @blackcatdevel0per
    @blackcatdevel0per 2 года назад

    6:58 А я раньше делал dict['key'] if 'key' in dict else None
    А можно как-то немного модифицировать штатный словарь для вызова без dict.get? Я просто ленивый 😅

    • @blackcatdevel0per
      @blackcatdevel0per 2 года назад

      О, а можно ли указать default при вызове через dict['key']?

    • @blackcatdevel0per
      @blackcatdevel0per 2 года назад

      Нашёл весьма интересный и удобный способ это сделать:
      >>> 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

  • @MyKashiwa
    @MyKashiwa 2 года назад +1

    Классно! Очень полезно

  • @ГубкаБоб-р8ъ
    @ГубкаБоб-р8ъ Год назад

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

    • @dmitriysviridenko2958
      @dmitriysviridenko2958 Год назад

      1. операция deepcopy медленнее
      2. приходится выделять лишнюю память под данные
      если словари маленькие особой разницы не заметите, но на собеседовании могут спросить, да и если данных много и там будут ещё какие-то тяжелые объекты то можно прикурить

  • @spi4caru950
    @spi4caru950 7 месяцев назад

    10:47 - ошибка есть

  • @TheVenelo
    @TheVenelo Год назад

    Что делать, если нужно добавить к существующему ключу с его значением дополнительное значение? То есть не просто обновить и затереть прошлое значение ключа, а добавить дополнительное значение, и так несколько раз. Например, есть объекты которые содержат Жанр, Имя Автора и Название его книги, и нужно сформировать вложенный словарь. {"Название жанра": {"Имя автора": ["Название книги"], {"Имя автора": ["Название книги", "Название книги"]}}} Если я просто начну обновлять значение я затру то что занес ранее. Пф как мог старался донести мысль))

    • @user-nu3ot7td1j
      @user-nu3ot7td1j Год назад

      не знаю актуально ли спустя 7 месяцев отвечать на комментарий, но может кому-то все же будет полезно
      мы используем для этого тот же get
      d['ключ'] = d.get(ключ, []) + [значение]
      получается у нас будет создан ключ в котором значение - пустой словарь, и если мы идет циклом for , то на каждой итерации можем добавлять в список новое значение

    • @ydjin3930
      @ydjin3930 10 месяцев назад

      @@user-nu3ot7td1j ага, а еще есть defaultdict(list). За конкатенацию по головке никто не погладит

  • @CrossBend
    @CrossBend Год назад

    15:45 - мозг сломался! как так все в одну строку заработало?

    • @ydjin3930
      @ydjin3930 10 месяцев назад +1

      ага, а еще можно было через zip() сразу 2 списка взять а не говнокодить
      {key: value for key, value in zip(list_1, list_2, strict=True)}
      или же просто dict(zip(list_1, list_2, strict=True))

  • @dealingounces6715
    @dealingounces6715 2 года назад +1

    я не до конца понимаю, что делает метод get?

    • @zproger
      @zproger  2 года назад +1

      Извлекает значение по ключу из словаря.
      Аналогично будет если написать a["name"],
      просто get это делает без ошибки KeyError.

    • @dealingounces6715
      @dealingounces6715 2 года назад

      @@zproger спасибо большое!

  • @TahirKabilov
    @TahirKabilov Год назад

    метод setdefault(key, default)

  • @bulik1384
    @bulik1384 Год назад +1

    куда ты так спешишь?

  • @grayich
    @grayich 2 года назад +1

    млять, я не успеваю, только начинаешь понимать какую тему, а уже на 3 темы вперёд ушло 😵‍💫 очень плотно и быстро, без пауз и пересмотров никак.
    консолька слишком высокая, куча лишней инфы, при этом прячется код который был до этого показан 100 микросекунд
    да и рабочее пространство на фулскрин хорошо бы, к чему эта "красота" вокруг съедающая полезное место когда его и так нехваатет

    • @vrabosh
      @vrabosh 2 года назад

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

    • @grayich
      @grayich 2 года назад

      @@vrabosh даже для таких это слишком, даже междупауз нет

  • @pythonForEvOne
    @pythonForEvOne Год назад

    все эти фишкит есть в офф доке, чтение которой занимает меньше 5ти минут

  • @demg7738
    @demg7738 Год назад

    Может кому-то пригодится:
    dd = defaultdict( dict )
    dd['a']['b']['c'] = 3
    Defaultdict принимает любую функцию, а не только и dict в данном случае всегда будет продуцировать новый словарь
    Так можно строить деревья произвольной глубины и ветвлений и это мегаполезная функция в том числе и в реальной работе.

    • @Simon_Simon
      @Simon_Simon Год назад +1

      Эта херня не работает.🤪

  • @ibrahimoglu
    @ibrahimoglu 2 года назад +1

    👍

  • @waltage
    @waltage Год назад

    а как обращаться к вложенному словари мы сами должны догадаться?

  • @eugenebubnov8468
    @eugenebubnov8468 Год назад

    Отвратительная подача материала... Куда лектор торопиться-то?

  • @TheKirp777
    @TheKirp777 7 месяцев назад

    Может, со словарями, а не с словарями? Ты робот что ли?

    • @zproger
      @zproger  6 месяцев назад

      именно)

  • @mammadalimammadaliyev6105
    @mammadalimammadaliyev6105 2 года назад +1

    Отписка за незнание синтаксиса кортежа

    • @zproger
      @zproger  2 года назад +1

      Просто забыл запятую поставить, с кем не бывает
      Но можете отписываться, никто не держит