Как создать словарь из двух списков разной длины, где первый список — ключи, второй — значения
Что проверяют
Прежде всего, спросите ли вы, что делать с несовпадающей длиной. Сама сборка словаря тривиальна, интерес в граничных случаях и знании стандартной библиотеки. Следом просят оценить сложность и сказать, что будет при повторяющихся ключах.
Как отвечать
Начните с уточнения: лишние ключи получают значение по умолчанию, лишние значения отбрасываются или разная длина это ошибка входных данных? Дальше варианты:
dict(zip(keys, values)):zipостанавливается на коротком списке. Если ключей больше, их хвост пропадёт молча;zip(keys, values, strict=True): с Python 3.10 бросаетValueErrorпри разной длине. Подходит, когда несовпадение означает баг;- ключи с дефолтом:
result = dict.fromkeys(keys), затемresult.update(zip(keys, values)). Все ключи на месте, недостающим достаётсяNone(или второй аргументfromkeys), лишние значения отброшены; - через индекс:
{k: values[i] if i < len(values) else None for i, k in enumerate(keys)}. Работает, но читается хуже.
Сложность у всех вариантов O(n) по времени и памяти. Про повторяющиеся ключи скажите сами: в словаре остаётся последнее значение. Если нужно сохранить все, собирайте defaultdict(list) и добавляйте значения через append.
Хороший финал ответа: оформить решение функцией с параметром default и парой проверок на крайние случаи, пустой список ключей и пустой список значений.
Где спотыкаются
Берут itertools.zip_longest(keys, values) и не проверяют случай, когда значений больше. Лишние значения получают ключ None, каждое следующее перезаписывает предыдущее, и в словаре появляется мусорная запись с ключом None.
Ищут значение через values[keys.index(k)]. Это O(n) на каждый ключ, в сумме квадрат, а при повторах в keys ещё и неверный результат.
Сразу пишут код, не спросив про требования. Интервьюер часто специально оставляет условие неполным, и вопрос «что делать с лишними элементами?» ценится выше самой строчки с zip.