Тест самоперевірки

Множини

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Ти пишеш «набір = {}» і одразу «набір.add("Аня")». Що станеться?

Чому так. Порожні фігурні дужки історично закріплені за dict, тож {} створює словник. Помилка виявиться аж на add — і саме тому вона підступна: рядок зі створенням виглядає бездоганно. Порожня множина пишеться лише як set().
Питання 2 / 8

У множині {"Аня", "Богдан"} немає «Петра». Чим відрізняться гурток.remove("Петро") і гурток.discard("Петро")?

Чому так. На наявному елементі вони поводяться однаково — різниця лише на відсутньому. Це те саме рішення, що між [] і .get() у словнику: якщо відсутність означає баг, бери remove, хай падає гучно; якщо відсутність нормальна — бери discard.
Питання 3 / 8

Перевіряєш, чи є слово в наборі з 2000 елементів. Слова в наборі немає. Скільки порівнянь зробить список і скільки — множина?

Чому так. Відповідь «немає» — найгірший випадок саме для списку: щоб сказати «ні», він мусить переглянути всі 2000 елементів. Множина рахує адресу комірки з самого слова й бачить, що там порожньо, — один крок і для «є», і для «немає». Варіант «1000 у середньому» описує випадок, коли елемент таки є.
Питання 4 / 8

A = {1, 2, 3}, B = {3, 4}. Що правильно про A - B і B - A?

Чому так. Різниця множин відповідає на питання «що є в лівій і немає в правій», тому перестановка операндів дає інший набір: {1, 2} проти {4}. Набір {1, 2, 4} — це вже симетрична різниця A ^ B, і вона від перестановки справді не залежить, як і | та &.
Питання 5 / 8

Які з цих об'єктів можна покласти в множину: (1, 2), [1, 2], (1, [2]), frozenset({1, 2})?

Чому так. У множину лягає те, що можна взяти ключем словника, — незмінне й хешоване. (1, [2]) обманює: кортеж незмінний, але хеш кортежа рахується з хешів елементів і спотикається об список усередині. frozenset — навпаки, це саме та незмінна множина, яку класти можна.
Питання 6 / 8

Чому список ключем словника бути не може, і як це пов'язано з множинами?

Чому так. Множина — це та сама хеш-таблиця, що й словник, тільки без масиву значень, тож обмеження переїхало без змін. Змінюваний елемент після зміни давав би інший хеш, отже іншу адресу, — а лежав би за старою. Python зупиняє це наперед: у списку __hash__ дорівнює None.
Питання 7 / 8

Ти набираєш print({10, 3, 25, 7}) і отримуєш {25, 10, 3, 7}. Що з цього правда?

Чому так. Для невеликих цілих hash(n) == n, тому 25, 10, 3 і 7 сідають у комірки 1, 2, 3 і 7, а читання йде по комірках підряд. Порядок не випадковий і не залежить від того, як ти записав елементи. Ось із рядками він справді змінюється між запусками — бо хеш рядка рандомізований.
Питання 8 / 8

Треба прибрати дублікати зі списку ['б', 'а', 'б', 'в'], зберігши порядок першої появи. Який спосіб правильний?

Чому так. Множина порядок не зберігає за конструкцією, тож list(set(...)) тут не підходить. sorted дасть алфавітний порядок, а не порядок першої появи — це різні речі. dict.fromkeys робить словник із унікальними ключами, а порядок вставки словник гарантує з Python 3.7.