Программирование на Python

Словари

Разбить на страницы
Показывать лекцию целиком

Списки в языке Python позволяют получить прямой доступ к элементу списка по его индексу. На практике необходима структура данных, позволяющая получить доступ к его элементам по ключу, который может быть произвольного типа, чаще всего, строкой текста. Типичным примером является англо-русский словарь, где ключом является английское слово, а элемент словаря задает перевод этого слова. С формальной точки зрения структура данных, называемая словарем (class dict в языке Python) представляет совокупность пар <Key : Value>, первый элемент пары задает ключ, второй - значение.

Словари в Python относятся к изменяемым типам. Константы этого типа заключаются в фигурные скобки.

Пример:

#Примеры работы со словарным типом данных (class dict)
def test1():
    #словарь
    #создание словаря
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    print(d)
    print(type(d))
    #доступ к элементу по ключу
    item = d["word"]
    print(item)
test1()

Результат работы:

В уже существующий словарь можно добавлять новые пары. Это можно делать по-разному, что демонстрирует следующий пример, где одновременно показана возможность работы с псевдонимами. В первом случае новая пара появляется в словаре в результате присваивания. Во втором случае пара добавляется методом update.

Пример:

def test2():
    #добавление новых пар в словарь. Псевдонимы
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    nd = d
    d["dict"] = "словарь"
    nd.update({"book":"книга"})
    print(d)
    print(nd)
test2()

Результаты работы:

Словарь не является последовательностью. Поэтому методы последовательности не применимы к словарям. Нельзя получить доступ по индексу к элементу словаря или получить срез словаря. Доступ к элементам осуществляется только по ключу. Метод keys позволяет получить коллекцию ключей как элемент специального класса dict_keys.

Пример работы с коллекцией ключей:

def test3():
    #доступ к ключам - метод keys 
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    keys = d.keys()    # ключи словаря   
    print(keys)
    print (type(keys)) # специальный класс - dict_keys
    #item = d["string"]
    item = "null"
    if "string" in keys:
        item = d[string]
    print(item)
    list_keys = list(keys)     #список ключей
    print("ключи до сортировки: ", list_keys)
    list_keys.sort()
    print("ключи после сортировки: ", list_keys)
    for key in list_keys:      #чтение словаря в порядке упорядочения ключей
        word = d[key]
        print(word)
    print(d)
test3()

Метод словаря keys позволил получить коллекцию ключей. Эта коллекцию полезна по той причине, что попытка обратиться к словарю с ключом, которого нет в словаре, приводит к ошибке. Заметьте, обращение к словарю с ключом "string" закомментировано, чтобы избежать появления ошибки в процессе выполнения теста. Когда нет уверенности существования в словаре пары с заданным ключом, приходится проверять наличие ключа в коллекции ключей, прежде чем обратиться к словарю.

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

Метод list позволяет преобразовать коллекцию ключей в список ключей, метод списка sort сортирует список. Используя этот список, теперь можно прочитать словарь в соответствии с упорядочением ключей. Конечно, сортировка списка ключей никак не влияет на порядок расположения ключей в словаре.

Результаты работы:

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

Пример:

def test4():
    #Упорядочение ключей. Метод sorted
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"}   
    sd = sorted(d)
    print(sd)
    print(type(sd));
    for key in sd:
        print(d[key])
test4()

Результаты работы:

Поиск в словаре ключа по значению

Словарь предназначен для поиска значения по ключу. Можно ли решить обратную задачу, - найти ключ, если задано значение пары. Хотя словарь для этого не предназначен, но имеющиеся методы позволяют решить эту задачу. Мы уже говорили, что словарь имеет метод keys, возвращающий коллекцию ключей, которую можно затем преобразовать в список. У словаря есть и метод values, возвращающий коллекцию значений, которую можно затем преобразовать в список. Имея эти два списка, можно решить поставленную задачу, поскольку для списков доступно индексирование. Вот соответствующий пример:

def test5():
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"}
    keys = d.keys()    
    values = d.values()
    list_keys = list(keys)
    list_values = list(values)
    index = list_values.index("значение")
    key = list_keys[index]
    print (key)
test5()

Результат:

value

Удаление элементов словаря, замена значения

Также как и добавление новых элементов в словарь замену значений можно выполнять двумя способами. Можно заменять значение, используя метод update, задавая пару с уже имеющимся ключом, но новым значением. Можно использовать присваивание, присваивая новое значение элементу с уже имеющимся ключом.

Для удаления элементов словаря используется метод pop. Метод возвращает в качестве результата значение элемента с заданным ключом. В качестве побочного эффекта элемент удаляется из словаря. Метод popitem удаляет последний элемент словаря. Ключ в этом случае указывать не нужно. В качестве результата в этом случае возвращается пара, содержащая ключ и удаляемый элемент.

Пример работы:

def test6():
    #замена и удаление элементов словаря
    d = {"word" : "слово", "book" : "книга","key" : "ключ", "value" : "значение"}    
    print(d)
    d.update({"book" : "бронировать"})
    print(d)
    d["book"] = "книга (существительное), бронировать (глагол)"
    print(d)
    v = d.pop("value")
    print(v) 
    vs = d.popitem()
    print(vs)
    print(d) 
test6()

Результаты работы:

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

Пример:

def test7():
    #ключи могут принадлежать разным типам
    #значения ключей уникальны 
    #значения значений могут совпадать 
    d = {"" : "конъюнкция", 4 : "четыре", "key" : "ключ", "clue" : "ключ"}
    print(d)    
    d.update({0.5 : "одна вторая"})    
    print("d_keys: ", d.keys())
test7()

Результаты работы:

Итоги

Подведем итоги. Тип данных " словарь" в языке Python (class dict) задает множество пар, первый элемент пары называется ключом, второй - значением. Зная ключ элемента, можно получить к нему доступ. Словарь - это изменяемый тип данных, это динамический тип данных, - в словарь можно добавлять новые пары, можно пары удалять, можно изменять значение существующей пары. Ключи и значения могут принадлежать разным типам. Единственное требование - уникальность ключей. Словарь не является потомком последовательности, поэтому невозможен доступ к элементам по индексу, не допускается итерирование словаря. Во многих ситуациях, когда доступ к элементам необходим по ключу, словарь - незаменимая структура данных.

Страницы:

Списки в языке Python позволяют получить прямой доступ к элементу списка по его индексу. На практике необходима структура данных, позволяющая получить доступ к его элементам по ключу, который может быть произвольного типа, чаще всего, строкой текста. Типичным примером является англо-русский словарь, где ключом является английское слово, а элемент словаря задает перевод этого слова. С формальной точки зрения структура данных, называемая словарем (class dict в языке Python) представляет совокупность пар <Key : Value>, первый элемент пары задает ключ, второй - значение.

Словари в Python относятся к изменяемым типам. Константы этого типа заключаются в фигурные скобки.

Пример:

#Примеры работы со словарным типом данных (class dict)
def test1():
    #словарь
    #создание словаря
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    print(d)
    print(type(d))
    #доступ к элементу по ключу
    item = d["word"]
    print(item)
test1()

Результат работы:

В уже существующий словарь можно добавлять новые пары. Это можно делать по-разному, что демонстрирует следующий пример, где одновременно показана возможность работы с псевдонимами. В первом случае новая пара появляется в словаре в результате присваивания. Во втором случае пара добавляется методом update.

Пример:

def test2():
    #добавление новых пар в словарь. Псевдонимы
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    nd = d
    d["dict"] = "словарь"
    nd.update({"book":"книга"})
    print(d)
    print(nd)
test2()

Результаты работы:

Словарь не является последовательностью. Поэтому методы последовательности не применимы к словарям. Нельзя получить доступ по индексу к элементу словаря или получить срез словаря. Доступ к элементам осуществляется только по ключу. Метод keys позволяет получить коллекцию ключей как элемент специального класса dict_keys.

Пример работы с коллекцией ключей:

def test3():
    #доступ к ключам - метод keys 
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"} 
    keys = d.keys()    # ключи словаря   
    print(keys)
    print (type(keys)) # специальный класс - dict_keys
    #item = d["string"]
    item = "null"
    if "string" in keys:
        item = d[string]
    print(item)
    list_keys = list(keys)     #список ключей
    print("ключи до сортировки: ", list_keys)
    list_keys.sort()
    print("ключи после сортировки: ", list_keys)
    for key in list_keys:      #чтение словаря в порядке упорядочения ключей
        word = d[key]
        print(word)
    print(d)
test3()

Метод словаря keys позволил получить коллекцию ключей. Эта коллекцию полезна по той причине, что попытка обратиться к словарю с ключом, которого нет в словаре, приводит к ошибке. Заметьте, обращение к словарю с ключом "string" закомментировано, чтобы избежать появления ошибки в процессе выполнения теста. Когда нет уверенности существования в словаре пары с заданным ключом, приходится проверять наличие ключа в коллекции ключей, прежде чем обратиться к словарю.

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

Метод list позволяет преобразовать коллекцию ключей в список ключей, метод списка sort сортирует список. Используя этот список, теперь можно прочитать словарь в соответствии с упорядочением ключей. Конечно, сортировка списка ключей никак не влияет на порядок расположения ключей в словаре.

Результаты работы:

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

Пример:

def test4():
    #Упорядочение ключей. Метод sorted
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"}   
    sd = sorted(d)
    print(sd)
    print(type(sd));
    for key in sd:
        print(d[key])
test4()

Результаты работы:

Поиск в словаре ключа по значению

Словарь предназначен для поиска значения по ключу. Можно ли решить обратную задачу, - найти ключ, если задано значение пары. Хотя словарь для этого не предназначен, но имеющиеся методы позволяют решить эту задачу. Мы уже говорили, что словарь имеет метод keys, возвращающий коллекцию ключей, которую можно затем преобразовать в список. У словаря есть и метод values, возвращающий коллекцию значений, которую можно затем преобразовать в список. Имея эти два списка, можно решить поставленную задачу, поскольку для списков доступно индексирование. Вот соответствующий пример:

def test5():
    d = {"word" : "слово", "key" : "ключ", "value" : "значение"}
    keys = d.keys()    
    values = d.values()
    list_keys = list(keys)
    list_values = list(values)
    index = list_values.index("значение")
    key = list_keys[index]
    print (key)
test5()

Результат:

value

Удаление элементов словаря, замена значения

Также как и добавление новых элементов в словарь замену значений можно выполнять двумя способами. Можно заменять значение, используя метод update, задавая пару с уже имеющимся ключом, но новым значением. Можно использовать присваивание, присваивая новое значение элементу с уже имеющимся ключом.

Для удаления элементов словаря используется метод pop. Метод возвращает в качестве результата значение элемента с заданным ключом. В качестве побочного эффекта элемент удаляется из словаря. Метод popitem удаляет последний элемент словаря. Ключ в этом случае указывать не нужно. В качестве результата в этом случае возвращается пара, содержащая ключ и удаляемый элемент.

Пример работы:

def test6():
    #замена и удаление элементов словаря
    d = {"word" : "слово", "book" : "книга","key" : "ключ", "value" : "значение"}    
    print(d)
    d.update({"book" : "бронировать"})
    print(d)
    d["book"] = "книга (существительное), бронировать (глагол)"
    print(d)
    v = d.pop("value")
    print(v) 
    vs = d.popitem()
    print(vs)
    print(d) 
test6()

Результаты работы:

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

Пример:

def test7():
    #ключи могут принадлежать разным типам
    #значения ключей уникальны 
    #значения значений могут совпадать 
    d = {"" : "конъюнкция", 4 : "четыре", "key" : "ключ", "clue" : "ключ"}
    print(d)    
    d.update({0.5 : "одна вторая"})    
    print("d_keys: ", d.keys())
test7()

Результаты работы:

Итоги

Подведем итоги. Тип данных " словарь" в языке Python (class dict) задает множество пар, первый элемент пары называется ключом, второй - значением. Зная ключ элемента, можно получить к нему доступ. Словарь - это изменяемый тип данных, это динамический тип данных, - в словарь можно добавлять новые пары, можно пары удалять, можно изменять значение существующей пары. Ключи и значения могут принадлежать разным типам. Единственное требование - уникальность ключей. Словарь не является потомком последовательности, поэтому невозможен доступ к элементам по индексу, не допускается итерирование словаря. Во многих ситуациях, когда доступ к элементам необходим по ключу, словарь - незаменимая структура данных.

Вернуться к учебному плану