Dictionaries - Learn Python 3 - Snakify

Lesson 11
Словари


1. Словари

Обычные списки (массивы) обычно представляют собой набор нумерованных элементов, поэтому, если вы хотите сделать ссылку на любой элемент списка, вы должны указать его номер. Число элементов в списке однозначно идентифицирует сам элемент. Но идентификационные номера не всегда удобны. Например, маршруты поездов в России используют буквы и цифры в качестве идентификационного кода (число и одну цифру), а также числовой алфавитный код идентифицирует полеты, то есть информация о полетах, поездах или идентификаторах самолета должна храниться не как номер, а как текстовую строку.

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

Рассмотрим простой пример. Получите словарь Capitals , где index - это название страны, а значение - название столицы этой страны. Теперь для ряда с названием страны мы можем легко идентифицировать свой капитал.

# Создайте пустые диктатные столицы
Capitals = dict()

# Заполните его некоторыми значениями
Capitals['Russia'] = 'Moscow'
Capitals['Ukraine'] = 'Kiev'
Capitals['USA'] = 'Washington'

Countries = ['Russia', 'France', 'USA', 'Russia']

for country in Countries:
  # Для каждой страны из списка проверьте, находится ли он в словаре Capitals
    if country in Capitals:
        print('The capital of ' + country + ' is ' + Capitals[country])
    else:
        print('The capital of ' + country + ' is unknown')

Таким образом, каждый элемент словаря состоит из двух объектов: ключа и значений . В нашем примере ключ - это название страны, а значение - это название капитала. Ключ идентифицирует элемент словаря, значение - данные, соответствующие данному ключу. Значения ключа уникальны, т.е. в словаре не может быть двух одинаковых ключей.

Мы привыкли к словарям вокруг нас, обычным бумажным словарям (определяющим, одноязычным, двуязычным). Для определения словаря ключевым является слово (заголовок статьи), а значение - сама статья, и для доступа к статье необходимо указать слово-ключ.

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

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

В Python ключ может быть любым неизменяемым (не изменяемым) типом данных: целыми числами и действительными числами, строками, кортежами. Ключ в словаре не может быть набором, но может быть элементом типа frozenset : особым аналоговым типом данных set типов, который не может быть изменен после создания. Значение словарного словаря может быть любым типом данных, в том числе модифицируемым.

Advertising by Google, may be based on your interests

2. Применение словарей

Словари используются в следующих случаях:

  • для подсчета количества некоторых объектов. В этом случае вам нужно сделать словарь, где ключи - это объекты, а значения - суммы.
  • хранение любых данных, связанных с объектом. Ключами являются объекты, значения - это связанные данные. Например, если вы хотите определить порядковый номер месяца по его имени, вы можете сделать это, используя словарь Num['January'] = 1; Num['February'] = 2; ...
  • устанавливая соответствие между объектами (например, «родитель-потомок»). Ключ - это объект, а значение - соответствующий объект.
  • если вам нужен простой массив, но максимальное значение индекса элемента очень велико, хотя не все возможные индексы будут использоваться (так называемый «разреженный массив»), вы можете использовать ассоциативный массив для сохранения памяти.

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

    Capitals = {'Russia': 'Moscow', 'Ukraine': 'Kiev', 'USA': 'Washington'}
    Capitals = dict(RA = 'Moscow', Ukraine = 'Kiev', USA = 'Washington')
    Capitals = dict([("Russia", "Moscow"), ("Ukraine", "Kiev"), ("USA", "Washington")])
    Capitals = dict(zip(["Russia", "Ukraine", "USA"], ["Moscow", "Kiev", "Washington"]))
    print(Capitals)
    

    Первые два метода можно использовать только для создания небольших словарей, перечисляя все их элементы. Кроме того, во втором методе ключи передаются как именованные параметры dict , поэтому в этом случае ключи могут быть только строками и только правильными идентификаторами. В третьем и четвертом случае вы можете создавать большие словари, если переданные аргументы являются готовым списком, который может быть получен не только из перечисления всех элементов, но и в любом другом виде во время выполнения программы. В третьем случае функция dict должна получить список, в котором каждый элемент является кортежем из двух элементов: ключ и значение. Четвертый метод использует функцию zip , которая должна получать два списка равной длины: список ключей и список значений.

    Advertising by Google, may be based on your interests
  • 3. Работа со словарными элементами

    Основная операция: получение значения элемента по его ключу. Он написан точно так же, как и для списков: A[key] . Если в словаре нет элемента с указанным ключом, он вызывает исключение KeyError .

    Другим способом определения значения на основе ключа является метод get : A.get(key) . Если нет элемента с ключом get в словаре, он возвращает None . В форме с двумя аргументами A.get(key, val) возвращает val , если элемент с ключевым key не находится в словаре.

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

    Чтобы добавить новый словарь в словарь, вам просто нужно присвоить его некоторым значением: A[key] = value .

    Чтобы удалить элемент из словаря, вы можете использовать del A[key] (операция вызывает исключение KeyError если в словаре нет такого ключа.) Вот два безопасных способа удаления элемента из словаря.

    A = {'ab' : 'ba', 'aa' : 'aa', 'bb' : 'bb', 'ba' : 'ab'}
    
    key = 'ac'
    if key in A:
        del A[key]
    
    try:
        del A[key]
    except KeyError:
    	print('There is no element with key "' + key + '" in dict')
    print(A)
    

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

    Другой способ удалить элемент из словаря - метод pop : A.pop(key) . Этот метод возвращает значение удаляемого элемента, и если элемент с данным ключом не находится в словаре, возникает исключение. Если метод pop получает второй параметр, чем для отсутствующего элемента, он возвращает значение этого параметра. Это позволяет безопасно организовать удаление элемента из словаря: A.pop(key, None) .

    Advertising by Google, may be based on your interests

    4. Итерирующий словарь

    Вы можете легко перебирать ключи всех элементов в словаре:

    A = dict(zip('abcdef', list(range(6))))
    for key in A:
        print(key, A[key])
    

    Следующие методы возвращают представление элементов словаря. Представления аналогичны наборам, но они меняются, если вы меняете значения элементов. keys метода возвращают представление ключей всех элементов, values возвращают представление всех значений, а items метода возвращают представление всех пар (кортежей) ключей и значений.

    Таким образом, для быстрой проверки, является ли значение val среди всех значений словаря A вы должны использовать логическое условие val in A.values() . Чтобы перебрать ключи и переменные, вы можете сделать следующее:

    A = dict(zip('abcdef', list(range(6))))
    for key, val in A.items():
        print(key, val)
    
    Advertising by Google, may be based on your interests