Представление словарей в языке Python

В данной статье мы рассмотрим, как работают представления словарей (dictionary comprehension) в языке Python. Будет приведено много примеров, из которых мы поймем основную концепцию представления словарей в Python и как оно используется в реальных задачах.

Что такое словарь

Словарь — это встроенный в Python тип данных, в котором значения данных связаны с соответствующими ключами. Грубо говоря, это очень похоже на SQL-таблицы, сходным образом данные хранятся и во многих статистических пакетах. Словарь состоит из двух основных компонентов:

  1. Ключи. Они сродни колонкам в SQL-таблицах и должны быть уникальными (как и названия колонок не могут повторяться).
  2. Значения. Они обладают свойствами рядов в таблицах и могут повторяться.

Словари заключаются в фигурные скобки {}, а ключи отделяются от значений двоеточием.

Синтаксис словарей

Словари в языке Python выглядят следующим образом:

d = {'a': [1,2], 'b': [3,4], 'c': [5,6]}

Здесь 'a', 'b' и 'c' являются ключами, а списки после двоеточия — значениями (данными). Чтобы извлечь ключи, данные и структуру словаря, можно воспользоваться следующими командами:

d.keys() # 'a', 'b', 'c' - это ключи
d.values() # [1, 2], [3, 4], [5, 6] - это данные
d.items()

Как в R или SAS, в Python мы можем создать из нашего словаря датафрейм, воспользовавшись библиотекой pandas.

import pandas as pd
pd.DataFrame(data = d)

В результате получим следующую таблицу:

   a  b  c
0  1  3  5
1  2  4  6

Что такое представление словарей

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

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

Разница между представлением списков и представлением словарей, как не сложно догадаться, состоит в том, что первая конструкция создает списки, а вторая соответственно словари. Синтаксис также слегка различается, так как словари в Python используют квадратные скобки [], а словари — фигурные {}.

Синтаксис представления словарей

{key: value for (key, value) in iterable}

 

Здесь iterable это любой объект языка Python, по которому можно производить итерацию при помощи цикла. Например, это могут быть списки, кортежи или строки. Рассмотрим следующий код:

keys = ['a', 'b', 'c']
values = [1, 2, 3]
{i: j for (i, j) in zip(keys, values)}

Этот код создает словарь: {'a': 1, 'b': 2, 'c': 3}. Также заметим, что точно такой же словарь можно создать при помощи встроенной функции dict следующим образом: dict(zip(keys, values)).

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

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

Представление словарей Цикл for
d = {i: i**2 for i in range(5)}

 

d = {}
for i in range(5):
    d[i] = i**2
print(d)

 

Здесь функция range(5) возвращает последовательность от 0 до 4 включительно (5 не входит).

Результат:

{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Функция d.keys() возвращает все ключи данного словаря d (в виде списка), а функция d.values() соответственно значения.

d.keys() # возвращает [0, 1, 2, 3, 4]
d.values() # возвращает [0, 1, 4, 9, 16]

Создание словаря с алфавитными ключами

Допустим, что мы хотим создать словарь, где ключами будут буквы латинского алфавита от ‘a’ до ‘e’, а значениями — числа от 0 до 4 включительно. Функция string.ascii_lowercase[:5] возвращает в качестве результата строку 'abcde'.

import string
{i: j for (i, j) in zip(string.ascii_lowercase[:5], range(5))

Данный код создаст словарь следующего вида:

{'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}

Создание нового словаря из уже существующего

Функция dic.items() возвращает словарь целиком, с ключами и соответствующими значениями. В следующем примере мы умножаем значения существующего словаря на 2 и создаем с этими измененными значениями новый словарь в переменной new_dic.

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
new_dic = {i: j * 2 for i, j in dic.items()}
new_dic

Результат:

{'a': 2, 'b': 4, 'c': 6, 'd': 8}

Использование оператора if в представлении словарей

В данном примере мы применим условный оператор if и отберем все значения больше 2.

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
{i: j * 2 for (i, j) in dic.items() if j > 2}

Результат:

{'c': 6, 'd': 8}

Конструкция if - else в представлении словарей

Так же как и в представлении списков, конструкцию if - else можно использовать в представлении словарей. В следующем примере мы проверяем четность числа и ставим данному ключу в соответствие значение либо ‘odd’ (нечетное), либо ‘even’ (четное).

dic = {'a': 1, 'b': 2, 'c': 3, 'd': 4}
{i: ('even' if j % 2 == 0 else 'odd') for (i, j) in dic.items()}

Результат:

{'a': 'odd', 'b': 'even', 'c': 'odd', 'd': 'even'}

Использование функции enumerate() в представлении словарей

Функция enumerate() может принимать на вход список, кортеж или строку и возвращает каждый элемент последовательности и его индекс в виде кортежей из двух элементов, первым идет индекс, вторым сам элемент. Вот пример работы этой функции:

list(enumerate(['a', 'b', 'c']))

Обернув функцию enumerate() в функцию list(), мы получаем в результате список кортежей:

[(0, 'a'), (1, 'b'), (2, 'c')]

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

mylist = ['a', 'b', 'c']
{j: i for (i, j) in enumerate(mylist)}

Результат:

{'a': 0, 'b': 1, 'c': 2}

Удаление выбранных элементов из словаря

Допустим, у нас есть словарь, который в качестве ключей содержит в себе определенные имена городов, имеющие некоторые числовые значения, и мы хотим удалить несколько городов (скажем, Дели и Лондон) вместе с их значениями. В нашем примере переменная i отвечает за ключи словаря, а выражение d[i] вычисляет значение по этому ключу. Например, d['Mumbai'] возвратит 221.

d = {'Delhi': 121, 'Mumbai': 221, 'New York': 302, 'London': 250}
{i: d[i] for i in d.keys() - {'Delhi', 'London'}}

В результате в словаре останется два элемента:

{'Mumbai': 221, 'New York': 302}