Как из двух списков сделать словарь python

Как сделать словарь из двух списков в Python

Совсем не давно я обратил свое внимание на Python, захотелось попробовать свои силы в программирование и если все получиться поменять сферу деятельности, но это еще только планы. В общем, в программирование на Python я не новичок, но до гуру мне еще очень далеко, поэтому если Вы найдете ошибки в моих статьях сообщите. Если Вы так же решили изучить Питон, то должны научиться работать со словарями и списками. Сегодня поговорим о том как создать словарь из списков.

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

Как собрать словарь из двух списков

И так допустим есть какие то списки, например.

Для того чтобы собрать словарь нужно воспользоваться функциями len и range в цикле for.

friends =
for i in range (len(friends_names)):
friends[names[i]] = cities [i]

То получим словарь.

Давайте немного разберем то что мы сделали, с помощью range мы задали последовательность чисел, с аргументом len(names). Функция len(names) посчитала и вернула нам количество элементов в списке

Мы увидим количество элементов в списке.

Далее мы просто сопоставили элементы двух списков friends[names[i]] = cities [i].

Самое главное чтобы элементы в списках соответствовал друг другу и их было одинаковое количество.

Словарь из двух списков : 2 комментария

Код не работает.
names = [‘Аня’, ‘Коля’, ‘Лёша’, ‘Лена’, ‘Миша’]
cities = [‘Владивосток’, ‘Красноярск’, ‘Москва’, ‘Обнинск’, ‘Чебоксары’]
friends =
for i in range (len(friends_names)):
friends[names[i]] = cities [i]
Выдает ошибку
File «», line 5
friends[names[i]] = cities [i]
^
IndentationError: expected an indented block

Конечно у тебя ничего работать не будет, так как во первых у тебя неверно кавычки стоят, а так же в 5ой строке нужно написать friends вместо friends_names. Короче должно быть вот так:
names = [‘Аня’, ‘Коля’, ‘Лёша’, ‘Лена’, ‘Миша’]
cities = [‘Владивосток’, ‘Красноярск’, ‘Москва’, ‘Обнинск’, ‘Чебоксары’]
friends =
for i in range (len(names)):
friends[names[i]] = cities [i]

Как из двух списков сделать словарь python

Словарь (dictionary) в языке Python хранит коллекцию элементов, где каждый элемент имеет уникальный ключ и ассоциированое с ним некоторое значение.

Определение словаря имеет следующий синтаксис:

В фигурных скобках через запятую определяется последовательность элементов, где для каждого элемента сначала указывается ключ и через двоеточие его значение.

В словаре users в качестве ключей используются числа, а в качестве значений — строки. То есть элемент с ключом 1 имеет значение «Tom», элемент с ключом 2 — значение «Bob» и т.д.

В словаре emails в качестве ключей используются строки — электронные адреса пользователей и в качестве значений тоже строки — имена пользователей.

Но необязательно ключи и строки должны быть однотипными. Они могу представлять разные типы:

Мы можем также вообще определить пустой словарь без элементов:

Преобразование списков и кортежей в словарь

Несмотря на то, что словарь и список — непохожие по структуре типы, но тем не менее существует возможности для отдельных видов списков преобразования их в словарь с помощью встроенной функции dict() . Для этого список должен хранить набор вложенных списков. Каждый вложенный список должен состоять из двух элементов — при конвертации в словарь первый элемент станет ключом, а второй — значением:

Подобным образом можно преобразовать в словарь двухмерные кортежи, которые в свою очередь содержать кортежи из двух элементов:

Получение и изменение элементов

Для обращения к элементам словаря после его названия в квадратных скобках указывается ключ элемента:

Например, получим и изменим элементы в словаре:

Если при установки значения элемента с таким ключом в словаре не окажется, то произойдет его добавление:

Но если мы попробуем получить значение с ключом, которого нет в словаре, то Python сгенерирует ошибку KeyError:

И чтобы предупредить эту ситуацию перед обращением к элементу мы можем проверять наличие ключа в словаре с помощью выражения ключ in словарь . Если ключ имеется в словаре, то данное выражение возвращает True:

Также для получения элементов можно использовать метод get , который имеет две формы:

get(key) : возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение None

get(key, default) : возвращает из словаря элемент с ключом key. Если элемента с таким ключом нет, то возвращает значение по умолчанию default

Удаление

Для удаления элемента по ключу применяется оператор del :

Но стоит учитывать, что если подобного ключа не окажется в словаре, то будет выброшено исключение KeyError. Поэтому опять же перед удалением желательно проверять наличие элемента с данным ключом.

Другой способ удаления представляет метод pop() . Он имеет две формы:

pop(key) : удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то генерируется исключение KeyError

pop(key, default) : удаляет элемент по ключу key и возвращает удаленный элемент. Если элемент с данным ключом отсутствует, то возвращается значение default

Если необходимо удалить все элементы, то в этом случае можно воспользоваться методом clear() :

Копирование и объединение словарей

Метод copy() копирует содержимое словаря, возвращая новый словарь:

Метод update() объединяет два словаря:

При этом словарь users2 остается без изменений. Изменяется только словарь users, в который добавляются элементы другого словаря. Но если необходимо, чтобы оба исходных словаря были без изменений, а результатом объединения был какой-то третий словарь, то можно предварительно скопировать один словарь в другой:

Перебор словаря

Для перебора словаря можно воспользоваться циклом for:

При переборе элементов мы получаем ключ текущего элемента и по нему можем получить сам элемент.

Другой способ перебора элементов представляет использование метода items() :

Метод items() возвращает набор кортежей. Каждый кортеж содержит ключ и значение элемента, которые при переборе мы тут же можем получить в переменные key и value.

Также существуют отдельно возможности перебора ключей и перебора значений. Для перебора ключей мы можем вызвать у словаря метод keys() :

Правда, этот способ перебора не имеет смысла, так как и без вызова метода keys() мы можем перебрать ключи, как было показано выше.

Для перебора только значений мы можем вызвать у словаря метод values() :

Комплексные словари

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

В данном случае значение каждого элемента словаря в свою очередь представляет отдельный словарь.

Для обращения к элементам вложенного словаря соответственно необходимо использовать два ключа:

Но если мы попробуем получить значение по ключу, который отсутствует в словаре, Python сгенерирует исключение KeyError:

Чтобы избежать ошибки, можно проверять наличие ключа в словаре:

Во всем остальном работа с комплексными и вложенными словарями аналогична работе с обычными словарями.

Python Zip: Как преобразовать список в словарь

Список и словарь относятся к числу надежных структур данных в Python. Преобразование друг из друга — самая частая задача, с которой вы когда-либо сталкивались при разработке Python. Вы часто обнаруживаете, что вам нужно создать словарь из двух разных, но тесно связанных последовательностей. Самый простой способ добиться этого — использовать вместе методы dict() и zip() .

Python Zip

Чтобы создать словарь из двух последовательностей, используйте методы dict() и zip(). В Python 3 метод zip() теперь возвращает ленивый итератор, который сейчас является наиболее часто используемым подходом.

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

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

Метод zip(fields, values) возвращает итератор, который генерирует кортежи из двух элементов. Если вы вызываете dict() на этом итераторе, вы можете создать нужный вам словарь. Элементы первого списка становятся ключами словаря, а элементы второго списка представляют значения в словаре.

Важно отметить, что dictionary = не работает. Вы должны явно объявить dict(zip()) . Если вы заставите его работать, то вам придется использовать правильное понимание словаря.

Понимание словаря

Понимание словаря — это элегантный и лаконичный способ создания словарей. Мы можем использовать приведенный выше пример для создания словаря из двух списков.

Пишем красивый идиоматический Python


Иногда сложно найти в Сети правильные, а главное актуальные «best practices» для языка. Документация, конечно же, содержит всю необходимую информацию, но отсеять нужную вещь в абзацах подробного (на то она и документация) описания довольно сложно. Но недавно мне улыбнулся поиск Google, и я наткнулся на очень полезные «паттерны» языка Python от одного из core разработчиков — Raymond Hettinger.

Примечание: Все рекомендации даны в нескольких вариантах: сначала идут самые «плохие» варианты, а дальше предлагается лучшая альтернатива. Актуально для версии языка 2.7, отличия для версии 3.3 читайте в примечаниях к конкретному «паттерну».

Цикл по массиву из чисел

Плохо: иногда пишут так.

Хорошо: лучший, с генератором. Но в 32 битной системе список из миллиона чисел будет занимать

Отлично: самый лучший вариант. В отличии от второго xrange возвращает только одно значение за раз, и не нужно лишнюю память для хранения всего массива.

Примечание: В версии Python 3.3 xrange уже в ядре и называеться просто range .

Цикл по списку

Плохо: часто бывшие С программисты пишут так.

Хорошо: лучший вариант.

Но если нужно пройти по списку задом на перед?

Плохо: опять, прошло из C дает о себе знать:

Хорошо: но в Python пишут вот так:

Цикл по списку с индексами

Плохо тоже что и выше.

Хорошо: более элегантный вариант:

Цикл по двум спискам

Плохо тоже что и выше.

Хорошо: с двух списков делаем один список кортежей. Проблема в том что zip использует больше памяти чем первый вариант.

Отлично: в отличии от zip , izip использует кэширование, что помогает существенно сэкономить память.

Примечание: В версии Python 3.3 izip вписан в ядро и называется просто zip .

Сортировка списка по алгоритму

Плохо: используя функцию для сравнения.

Хорошо: используя сортировку по ключу. Использует намного меньше памяти.

Примечание: Метод cmp убран с ядра Python 3.x.

Цикл по ключам словаря

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

Для изменения словаря в цикле используйте цикл по ключам (Пример: удаление всех ключей начинающихся с R ):

В этом случае d.keys() делает копию ключей словаря, что позволяет нам свободно работать с оригинальной структурой.

Цикл по ключам и значением словаря

Плохо: цикл по ключам и возвращение значение по последним. Медленный способ:

Хорошо: быстрее делать цикл по значениях:

Отлично: Но самый лучший и быстрый способ это использовать итератор:

Соединение двух списков в один словарь

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

Подсчет элементов в словаре

Плохо: обычный способ:

Хорошо: использует функцию get() :

Отлично: самый продвинутый способ это использовать defaultdict() . Но вы должны знать как он работает.

Группирование элементов списка

Плохо: если нужно сгруппировать элементы списка по некоторому признаку (в примере — длина строки) часто используют такой метод:

Хорошо: но есть способ гораздо элегантней и быстрее:

На сегодня все. Надеюсь эти тривиальные, но полезные примеры помогут кому-то улучшить свой код, как они помогли это сделать мне. Их автором является Raymond Hettinger (@raymondh), Python Core Developer.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *