Множества и словари

TODO насыпать очевидных примеров {i} .

Внимание: подробный рассказ про хеш-функции и хеш-таблицы см. в записях предыдущих лет (в первую очередь 2019)

Коротко про функцию хеширования:

Множества и hash()

Хеш объекта в python используется в первую очередь для предварительного сравнения

⇒ Специальная функция hash() — числовой хеш от константного объекта

Почему id() — плохая хеш-функция?

Множества

Множества в Python реализованы как хеш-таблицы:

set.svg

Элементы множества не упорядочены (можно заметить следы упорядочивания по хешам, с учётом перехеширования и масштабирования):

   1 >>> s = {str(i) for i in range(10,30)}
   2 >>> s
   3 {'18', '19', '25', '29', '23', '27', '16', '11', '17', '20', '15', '28', '14', '24', '26', '13', '22', '10', '12', '21'}
   4 >>> [hash(c)%128 for c in s]
   5 [8, 10, 11, 10, 25, 32, 39, 40, 39, 64, 72, 76, 95, 100, 106, 110, 115, 122, 125, 127]
   6 

Множества — модифицируемые объекты, но есть и константные: frozenset

Дополнительное свойство: хеш составного объекта разный для разных запусков интерпретатора (туда однократно подмешивается случайное значение). Иначе можно было бы подобрать такое множество, на котором операции бы имели линейную сложность.

Словари

Задача: хранить произвольные объекты, каждый из которых однозначно соответствует хорошо хешируемой константе.

{i} Использование

Словари внутри Python

Передача пространства имён как параметра

Именные параметры функции

Позиционные параметры — кортеж, именные — словарь.

Модуль collections

Д/З

  1. Прочитать и прощёлкать
  2. EJudge: SetJuggler 'Манипуляция множествами'

    Написать программу-интерпретатор языка манипуляции множествами. На вход подаются слова, разделённые пробелами и переводами строк (слово — последовательность непробельных символов), затем — пустая строка, затем — программа на языке управления множествами, ввод заканчивается пустой строкой. Программа формирует множества и сохраняет их под заданными именами. В начале работы задано единственное множество с именем ALL. Операторы языка работают как с элементами одного множества, так и с элементами нескольких. В этом случае имена перечисляются через запятую без пробелов.

    • print множества — вывести в отсортированном виде через пробел все элементы множеств

    • search множества where строка to имя — найти все элементы множеств, содержащие строку, и сформировать из них множество имя

    • search множества for множества_поиска to имя — найти все элементы множеств, которые содержатся также и в каком-нибудь из множеств_поиска, и сформировать из них множество имя

    Input:

    Ходя на практические кризисы потенциалов, едящее вдали от тени абстракций 
    божество организации знакомилось в религии армии, содействуя сему 
    и ночному оппортунизму. Дифференцирует бесполезного Мазовецкого 
    с периодом, усмехаясь над эволюционными определениями, Рейган утренних 
    абсолютных воскресений. Организация означала характеры ребенком, 
    ходя за исполнителей с лекцией, но не желала между первоначальным 
    воинствующим поражением и элементарным объектом образовываться качествами. 
    Эта и надоедливая шапка извращается исполнителем, но не хочет над 
    комплексным воскресеньем без сред преобразиться четвергом без практики. 
    Способствуя мышам с полем, материализм является государственным 
    четвергом. Собака формулирует натуральную и недоношенную ложку индивиду 
    без структур; она осмыслила университет критическими и утренними 
    качествами, гамадрилами догматизмов нося студенческого Мазовецкого. 
    Абстрагировали над целями с именами индивиды, сказанные о колхознице 
    и являвшиеся этим и идеалистическим университетом. Пьяное условие 
    с теорией смеет между подозрительными материалами среды материальной 
    разработкой без оппортунизма осуществлять единства искусственных 
    стипендий. Формулировал пьяный объект потенциалу познанный поэтический 
    Эзоп с елью и формулировал реформизмы закону, позвонив архаичному 
    процессу. Воскресенья мыслят философией, шумя в студенческой и специфической 
    
    search ALL where фи to ФИ
    print ФИ
    search ALL where ил to ИЛ
    print ИЛ
    search ФИ,ИЛ where о to ФИЛО
    print ФИЛО
    search ФИЛО for ИЛ to НЕФИЛ
    print НЕФИЛ
    Output:

    специфической философией,
    гамадрилами знакомилось осмыслила философией,
    знакомилось осмыслила специфической философией,
    знакомилось осмыслила философией,

LecturesCMC/PythonIntro2025/06_SetsDicts (последним исправлял пользователь FrBrGeorge 2025-10-12 22:49:25)