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

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

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

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

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

Почему не id()?

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

Множества

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

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

   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

Словари

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

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

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

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

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

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

Модуль collections

Д/З

  1. Прочитать и прощёлкать
  2. EJudge: MumboJumbo 'Мумбо-Юмбо'

    Ввод представляет собой строки из букв латинского алфавита (последняя строка — пустая). Это письмена на языках двух племён: Mumbo и Jumbo. Слова из двух языков идут попеременно: на строках с чётным номером — из одного языка, на строках с нечётным — из другого (какого — неизвестно). Языки Mumbo и Jumbo имеют одинаковые гласные и разные согласные, причём согласных в языке Mumbo больше, чем в Jumbo. Все слова начинаются на гласную. Определить и вывести, какому языку — Mumbo или Jumbo — принадлежит первое слово, если известно, что в данном корпусе текстов:

    1. Использованы все начальные гласные (буква, на которую не начинается ни одно слово — согласная)
    2. Использованы все согласные
    Input:

    obmdobo
    oututo
    odbann
    ufututu
    omdan
    uputupf
    adabo
    utupopot
    obomna
    utpouo
    amdm
    Output:

    Mumbo
  3. EJudge: PopularWord 'Самое популярное слово'

    Ввести построчно текст, состоящий из пробелов, переводов строки и латинских букв, и заканчивающийся пустой строкой. Вывести слово, которое чаще других встречается в тексте, если оно такое одно, и ---, если таких слов несколько.

    Input:

    Sed tempus ipsum quis eros tempus lacinia Cras finibus lorem ut lacinia egestas nunc nibh iaculis est convallis tincidunt
    mi mi sed nisl Sed porttitor aliquam elit ullamcorper tincidunt arcu euismod quis Mauris congue elit suscipit leo varius
    facilisis Cras et arcu sodales laoreet est vitae pharetra orci Integer eget nulla dictum aliquet justo semper molestie neque
    Maecenas bibendum lacus tincidunt auctor varius purus felis ullamcorper dui et laoreet ligula ex et risus Donec eget
    fringilla nibh Cras congue tincidunt accumsan Maecenas euismod eleifend elit ut rhoncus tortor sodales a Cras egestas
    finibus lorem non tempor tincidunt aera
    Output:

    tincidunt
  4. EJudge: DungeonMap 'Карта подземелья'

    Вводится карта проходимых в обе стороны тоннелей подземлья в виде строк, содержащих разделённые пробелом названия двух пещер, которые соединяет соответствующий тоннель. Две последние строки не содержат пробелов — это название входа в подземелье и название выхода. Вывести "YES", если из входа можно попасть в выход, и "NO" в противном случае. Пары могут повторяться или содержать одинаковые слова.

    Input:

    markers jumping
    jumping guinea
    skiing pre
    markers gauge
    skiing mpeg
    solar jackson
    skiing solar
    guinea gauge
    mpeg honor
    pre honor
    guinea gauge
    pre mpeg
    markers guinea
    markers gauge
    honor mpeg
    markers jumping
    skiing
    jumping
    Output:

    NO
  5. EJudge: EvalFormulae 'Вычисление формулы'

    Написать функцию evalform(formula, *args), принимающую переменное количество параметров. Обязателен только первый параметр — это строка с некоторой формулой. В формуле могут встречаться переменные. Имена переменных состоят из одной или нескольких букв. Остальные параметры — это значения этих переменных, если их перечислить в алфавитном порядке. Функция должна возвращать результат вычисления формулы. Проверять правильность или обрабатывать исключения не надо.

    • UPD: в данной задаче любые буквы означают переменные, то есть не используются операции Python, задаваемые буквами (типа «in», «and» и т. п.)

    print(evalform("b*2 + a*3 + b//3 + c", 11, 3, 2))
    Input:

    print(evalform("b*2 + a*3 + b//3 + c", 11, 3, 2))
    Output:

    42

LecturesCMC/PythonIntro2023/06_SetsDicts (последним исправлял пользователь FrBrGeorge 2024-10-13 22:24:19)