Словари Python
Введение
Официальная документация: 1 , 2
Создать словарь
Чтобы создать словарь нужно воспользоваться фигурными скобками {}
{key: value}
Ключ должен быть неизменяемым объектом, то есть число, строка или кортеж подойдут, а, например
список
нет
На сохранение порядка элементов в словаре рассчитывать нельзя.
>>> urls = { ... 'Forward': 'https://forward.bike', ... 'Shulz': 'https://velodrive.ru', ... 'Stels': 'https://velosklad.ru', ... 'TB': 'https://topbicycle.ru' ... }
Получился словарь из четырёх пар "ключ: значение"
>>> urls['Stels']
В качестве ключей можно использовать и числа
def Test(): numbers = { 0: "Zero", 1: "One" } o = numbers[0] print(o) if __name__ == "__main__": Test()
Zero
Добавить пару к словарю
Пара ключ-значение добавляется к словарю следюущим образом
my_dict["key"] = value
d = {"a": 1} d["b"] = 2 print(d)
{'a': 1, 'b': 2}
Превратить в словарь
С помощью функции dict() можно превратить в словарь список кортежей
names_and_ages = [('Alice', 32), ('Bob', 48), ('Charlie', 28), ('Daniel', 33)] d = dict(names_and_ages) print(d)
{'Alice': 32, 'Bob': 48, 'Charlie': 28, 'Daniel': 33}
Превратить список кортежей в словарь можно и без функции dict(), но это требует больше кода.
names_and_ages = [('Alice', 32), ('Bob', 48), ('Charlie', 28), ('Daniel', 33)] new_dict = {} for person in names_and_ages: new_dict[person[0]] = person[1] print(f"new_dict: {new_dict}")
new_dict: {'Alice': 32, 'Bob': 48, 'Charlie': 28, 'Daniel': 33}
С помощью dict() можно создать словарь перечислив через запятую аргументы типа ключ-значение
phonetic = dict(a="alfa", b="bravo", c="charlie", d="delta", e="echo", f="foxtrot") print(phonetic)
{'a': 'alfa', 'b': 'bravo', 'c': 'charlie', 'd': 'delta', 'e': 'echo', 'f': 'foxtrot'}
Копирование словарей как и списков это неполное (shallow copy) копирование то есть копируются не объекты а ссылки на них. Подробно разницу можно увидеть здесь
# copy dict d = dict(it="eth1.ru", bikes="topbicycle.ru", travel="heihei.ru") e = d.copy() print(e) f = dict(e) print(f) # Next method will not create a copy # g will be the same object g = e print(g) print(e is d) print(e == d) print(f is e) print(f == e) print(g is e) print(g == e) # Let's prove g is not a copy d["it"] = "eth1.ru" print('d["it"] = "eth1.ru"') print('d["it"] = "eth1.ru"') print("d: ", d) print("e: ", e) print("f: ", f) print("g: ", g) e["it"] = "devhops.ru" print('e["it"] = "devhops.ru"') print("e: ", e) print("f: ", f) print("g: ", g)
{'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} False True False True True True d["it"] = "eth1.ru" d: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} e: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} f: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} g: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} e["it"] = "devhops.ru" e: {'it': 'devhops.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} f: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} g: {'it': 'devhops.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'}
Update: добавить один словарь к другому
# update d = dict(it="eth1.ru", bikes="topbicycle.ru", travel="heihei.ru") e = dict(hotels="booking.com", flights="aviasales.ru", trains="tutu.ru") print("d: ", d) print("e: ", e) e.update(g) print("e.update(g)") print("e: ", e)
d: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'} e: {'hotels': 'booking.com', 'flights': 'aviasales.ru', 'trains': 'tutu.ru'} e.update(g) e: {'hotels': 'booking.com', 'flights': 'aviasales.ru', 'trains': 'tutu.ru', 'it': 'devhops.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'}
С помощью update() можно не только добавить новые но и изменить старые значения.
print('d.update(it="eth1.ru")') print("d: ", d)
d.update(it="eth1.ru") d: {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru'}
Iteration: перебор элементов словаря
# iteration sites = dict( it="eth1.ru", bikes="topbicycle.ru", travel="heihei.ru", hotels="booking.com", flights="aviasales.ru", trains="tutu.ru" ) for key in sites: print(f"{key} => {sites[key]}")
it => eth1.ru bikes => topbicycle.ru travel => heihei.ru hotels => booking.com flights => aviasales.ru trains => tutu.ru
print("\nkeys:\n") for key in sites: print(key) for key in sites.keys(): print(key) print("\nvalues:\n") for value in sites.values(): print(value)
keys: it bikes travel hotels flights trains it bikes travel hotels flights trains values: eth1.ru topbicycle.ru heihei.ru booking.com aviasales.ru tutu.ru
Items: перебор кортежами из пар ключ-значение
С помощью items() можно перебирать парами ключ-значени, возвращаться будет кортеж (tuple)
# items print("\nitems:\n") for key, value in sites.items(): print(f"{key} => {value}")
items: it => eth1.ru bikes => topbicycle.ru travel => heihei.ru hotels => booking.com flights => aviasales.ru trains => tutu.ru
in, not in, del
# in and not in print("in and not in\n") sites = dict( it="eth1.ru", bikes="topbicycle.ru", travel="heihei.ru", hotels="booking.com", flights="aviasales.ru", trains="tutu.ru" ) print("it" in sites) # True print("eth1.ru" in sites) # False since eth1.ru is not a key print("velodrive" not in sites) # True # del del sites["hotels"] print('del sites["hotels"]') print(sites)
in and not in True False True del sites["hotels"] {'it': 'eth1.ru', 'bikes': 'topbicycle.ru', 'travel': 'heihei.ru', 'flights': 'aviasales.ru', 'trains': 'tutu.ru'}
Модификация значений внутри словаря
m = { 'H': [1, 2, 3], 'He': [3, 4], 'Li': [6, 7], 'Be': [7, 9, 10], 'B': [10, 11], 'C': [11, 12, 13, 14] } print(m) m['H'] += [4, 5, 6, 7] print(m) m['N'] = [13, 14, 15]
{'H': [1, 2, 3], 'He': [3, 4], 'Li': [6, 7], 'Be': [7, 9, 10], 'B': [10, 11], 'C': [11, 12, 13, 14]} {'H': [1, 2, 3, 4, 5, 6, 7], 'He': [3, 4], 'Li': [6, 7], 'Be': [7, 9, 10], 'B': [10, 11], 'C': [11, 12, 13, 14]} {'B': [10, 11], 'Be': [7, 9, 10], 'C': [11, 12, 13, 14],
pprint: читаемый вывод
С помощью pprint() можно вывести словарь на экран в читаемом виде
from pprint import pprint as pp m = { 'H': [1, 2, 3], 'He': [3, 4], 'Li': [6, 7], 'Be': [7, 9, 10], 'B': [10, 11], 'C': [11, 12, 13, 14] 'N': [13, 14, 15] } pp(m)
'H': [1, 2, 3, 4, 5, 6, 7], 'He': [3, 4], 'Li': [6, 7], 'N': [13, 14, 15]}
get()
С помощью метода get() можно получить значение по ключу.
Синтаксис
Dict.get(key, default=None)
Параметры:
key: имя ключа, значение которого нужно получить
Value: (Необязательный) значение которое нужно вернуть, если ключ не найден. По умолчанию возвращает None.
Пример: рассмотрим словарь где ключи - это названия городов Андалусии
(Испания), а значение - это численность их населения в тысячах человек
Применим get() только с одним аргументом, затем с двумя для города из списка и города не из списка
cities = {"Benalmadena": 67, "Cordoba": 325, "Fuengirola": 75, "Malaga": 569, "Torremolinos": 68} print(cities.get("Cordoba")) print(cities.get("Malaga", "Unknown")) print(cities.get("Riga", "Unknown"))
325 569 Unknown
Рига - это город в Латвии а не в Испании, поэтому get() вернул Unknonw