Изучаем Python. №6. Словари.


Словарь есть самый гибкий встроенный тип после списков и является НЕУПОРЯДОЧЕННОЙ коллекцией значений.


Особенности словарей:
1. Доступ по ключу. Есть возможность получить доступ к элементам в цикле по ключам.
2. Значения словаря хранятся в НЕОТСОРТИРОВАННОМ порядке, а ключи могут храниться не встом порядке, в котором они добавляются.
3. Словарь может хранить вложенные словари. Значения словаря могут быть любого типа. Ключь в словаре — immutable тип, может быть строкой, целым числом, float либо кортежем, состоящим из укзанных типов.
4. Словари реализованы как хеш-таблицы с быстрым доступом.
5. Словари хранят ссылки на объекты, а не сам объект.

Основными операциями над словарем являются: сохранение с заданным ключом и извлечение по нему значения. Также можно удалить пару key: value с помощью инструкции del.

Методы (функции) словаря:

  • dict() — создание словаря;
  • len() — возвращает число пар;
  • clear() — удаляет все значения из словаря;
  • copy() — создает псевдокопию словаря;
  • deepcopy() — создает полную копию словаря;
  • fromkeys() — создание словаря;
  • get() — получить значение по ключу;
  • has_key() — проверка значения по ключу;
  • items() — возвращает список значений;
  • iteriyems() — возвращает итератор;
  • keys() — возвращает список ключей;
  • iterkeys() — возвращает итератор ключей;
  • pop() — извлекает значение по ключу;
  • popitem() — извлекает произвольное значение;
  • update() — изменяет словарь;
  • values() — возвращает список значений;
  • itervalues() — возвращает итератор на список значений.
  • in — оператор, проверяет наличие значения по ключу;
  • del — оператор, удаляет пару по ключу;
  • dict() — конструирует словарь с помощью последовательности.

На примере небольшой программки — телефонной книге покажем некоторые операции со словарями:

Код:
 telbook = {'sasha': "32-11-4", 'vanya': '44-65-99'} # Объявляем словарь
 telbook['fedya'] = '22-47-32' # добавляем новый объект в словарь
 print telbook # Выводим все значения словаря
 print telbook['vanya'] # Выводим номер значения 'vanya'
 del telbook['sasha'] # удаляем значение 'sasha'
 print telbook # смотрим, что получилось
 print telbook.keys() # Выводим значения
 print telbook.has_key('vanya') # проверяем, есть ли в словаре значение 'vanya'
Результат:
 {'vanya': '44-65-99', 'fedya': '22-47-32', 'sasha': '32-11-4'}
 44-65-99
 {'vanya': '44-65-99', 'fedya': '22-47-32'}
 ['vanya', 'fedya']
 True

Способы создания словаря:
1. По аналогии со списками и кортежами. Только скобочки фигурные {}:

>>> s = {'name': 'Vitaliy', 'age': 25}
>>> s
{'age': 25, 'name': 'Vitaliy'}

2.Динамически. По мере надобности:

>>> s['name'] = 'Vitaliy'
>>> s['age'] = 26
>>> s
{'age': 26, 'name': 'Vitaliy'}

3. Используя метод dict(). При этом ключи должны быть строками. С помощью этого метода можно писать ключ без кавычек. Ниже представлены четире варианта заполнения словаря:

>>> s1 = dict(id = 1, name = "Vitaliy", age = 26)
>>> s1
{'age': 26, 'name': 'Vitaliy', 'id': 1}
>>> s2 = dict({"id": 1, "name": "Vitaliy", "age": 26})
>>> s2
{'age': 26, 'id': 1, 'name': 'Vitaliy'}
>>> s3 = dict([('id',1),('name',"Vitaliy"),("age",26)])
>>> s3
{'age': 26, 'id': 1, 'name': 'Vitaliy'}
>>> s4 = dict(zip(('id','name','age'),(1,'Vitaliy',26)))
>>> s4
{'age': 26, 'id': 1, 'name': 'Vitaliy'}

4.используя метод fromkeys() — создает словарь из указанного списка ключей с пустыми значениями.

>>> d = {}.fromkeys(['name','age'],123)
>>> d
{'age': 123, 'name': 123}

или

>>> d = {}.fromkeys(['name','age'])
>>> d
{'age': None, 'name': None}

5. С помощью конструктора:

>>> s = dict((x,x**2) for x in xrange(5))
>>> s
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Ну, а теперь практика, пробуем создать словарь с помощью списка кортежей:

>>> list = [('name','age'),('Tanya',25)]
>>> s = dict(list)
>>> s
{'Tanya': 25, 'name': 'age'}
>>> len(s) # Длина словаря (количество значений)
2

Создаем небольшую базу данных и производим поиск поней:

Код:
ludi = {'Ivan': {'phone': '23-44-6', 'age' : '20'},
        'Igor': {'phone': '45-2-67', 'age' : '40'}}
name = raw_input("Vvedite imya, chtobi uznat nomer telefona: ")
key = 'phone'
if name in ludi:
    print "%s phone is %s" % (name, ludi[name][key])
Результат:
Vvedite imya, chtobi uznat nomer telefona: Igor
Igor phone is 45-2-67

Что за странные символы %S смотрите тут.

Копирование словаря с помощью метода copy() :

>>> x = {'name':'admin','room':[1,10,2]}
>>> y = x.copy()
>>> y
{'name': 'admin', 'room': [1, 10, 2]}

Но метод copy() лишь показывает содержимое источника. Например, если мы удалим удно значения из списка ‘room’ в x, то увидим, что оно пропало и в y:

>>> x['room'].remove(1)
>>> y
{'name': 'admin', 'room': [10, 2]}

Чтобы этого не произошло, используем deepcopy():

>>> from copy import deepcopy
>>> y = x.deepcopy()

Метод get() — Выводит значение по ключу,a в случае отсутствия дает None:

>>> a = {'name':"Vitaliy"}
>>> print a.get('name')
Vitaliy

Метолд items() — возвращает весь список значений словаря:

Код:
d = {'name':'user','room':'125'}
for key, value in d.items():
    print(key, value)

Результат:
('name', 'user')
('room', '125')

Метод iteriyems() — возвращает итератор — выдает тот же результат:

Код:
for k, v in d.iteritems():
    print k, v

Результат:
name user
room 125

Метод keys() — возвращает список ключей.

>>> print d.keys()
['name', 'room']

Метод pop() — извлекает значение по ключу с последующим удалением:

>>> d.pop('name')
'user'
>>> d
{'room': '125'}

Метод popitem() — извлекает произвольное значение с последующим удалением.

Метод update() — изменяет значение словаря по ключу:

>>> d1 = {'room':'12'}
>>> d.update(d1)
>>> d
{'room': '12'}

Метод values() — возвращает список значений:

>>> d.values()
['12']

Оператор del — удаляет пару ключ: значение по ключу:

>>> del d['room']
>>> d
{}

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.

×