ПРОДОЛЖИТЬ СКАЧИВАНИЕ


Изучаем 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
{}

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

  1. Владимир

    Добрый день.
    Есть словарь:
    «data»: [
    {
    «id»: 1,
    «name»: «Bitcoin»,
    «symbol»: «BTC»,
    «slug»: «bitcoin»,
    «circulating_supply»: 17449525,
    «total_supply»: 17449525,
    «max_supply»: 21000000,
    «date_added»: «2013-04-28T00:00:00.000Z»,
    «num_market_pairs»: 6722,
    «tags»: [
    «mineable»
    ],
    «platform»: null,
    «cmc_rank»: 1,
    «last_updated»: «2018-12-28T20:52:23.000Z»,
    «quote»: {
    «USD»: {
    «price»: 3940.73971731,
    «volume_24h»: 5662721166.19099,
    «percent_change_1h»: 0.0797691,
    «percent_change_24h»: 7.33922,
    «percent_change_7d»: 0.0712122,
    «market_cap»: 68764036215.69377,
    «last_updated»: «2018-12-28T20:52:23.000Z»
    }
    }
    },
    {
    «id»: 52,
    «name»: «XRP»,
    «symbol»: «XRP»,
    «slug»: «ripple»,
    «circulating_supply»: 40794121066,
    «total_supply»: 99991738974,
    «max_supply»: 100000000000,
    «date_added»: «2013-08-04T00:00:00.000Z»,
    «num_market_pairs»: 310,
    «tags»: [],
    «platform»: null,
    «cmc_rank»: 2,
    «last_updated»: «2018-12-28T20:52:02.000Z»,
    «quote»: {
    «USD»: {
    «price»: 0.375143818798,
    «volume_24h»: 806009499.430558,
    «percent_change_1h»: -0.399194,
    «percent_change_24h»: 7.29676,
    «percent_change_7d»: 3.7948,
    «market_cap»: 15303662361.20718,
    «last_updated»: «2018-12-28T20:52:02.000Z»
    }
    }
    }
    При совпадении «name»: «Bitcoin»
    необходимо извлечь цену, а именно «price»: 3940.73971731
    Если «name»: «XRP»
    то соответственно
    «price»: 0.375143818798
    Спасибо.

  2. Володимир

    Интересно использование значений ключей словаря как функций.
    Функции в уроках немного впереди, но тема очень интересная, поэтому хотел бы поделиться (сам прочитал на англ. и немного подкорректировал 🙂 )

    Например надо для значений 0, 1, 2, .. 8, 9 вывести некоторые данные:

    для 0: это нуль
    для 1, 4 и 9: это квадрат
    для 2, 6 и 8: это чётное число
    для 3, 5 и 7: это это простое число
    для любых остальных значений: какое-то другое действие

    Можно конечно испоьзовать кучу if — elif. А если это куча других значений и т.д.?
    (примерно с if -elif это выглядело бы так:

    if n == 0:
    print(‘Это просто нуль.\n’)
    elif n == 1 or n == 9 or n == 4:
    print(‘Это квадрат\n’)
    elif n == 2 or n == 6 or n == 8:
    print(‘Это чётное число\n’)
    elif n== 3 or n == 5 or n == 7:
    print(‘Это простое число\n’)
    else:
    print(‘Выполняем что-то для других значений\n’)

    А вот если бы этих значений было бы поболее и для каждого было бы разное действие?!
    Эти вложения с ума могут свести, когда читаешь код и пытаешься разобраться 🙂

    И вот интересное решение:

    Описываем словарь

    options = {0 : zero, 1: sqr, 4: sqr, 9: sqr, 2: even, 6: even, 8: even, 3: prime, 5: prime, 7: prime,}

    Значения ключей 0, 1, 2, … 9 описываем как функции — действия для каждого ключа:

    def zero():
    ….print(‘Это просто нуль.\n’)

    def sqr():
    ….print(‘Это квадрат\n’)

    def …. и так далее.

    Проверка будет выглядеть вот так элегантно: options[value] (). Не правда ли, прочитать такой код намного проще и понятнее!

    Проверим для значения 7:

    x = 7
    options[x]()

    Проверьте, насколько легче и понтянее сталj почтение кода, стоит только глянуть на словарь :))
    (конечно, код может показаться слишком длинным по сравнению с if — elif.. Но это на первый взгляд ))
    Хотя это просто возможность, одна из, и очень даже прикольная 8)

    # Весь код:

    def zero():
    ….print(‘Это просто нуль.\n’)

    def sqr():
    ….print(‘Это квадрат\n’)

    def even():
    ….print(‘Это чётное число\n’)

    def prime():
    ….print(‘Это простое число\n’)

    def process_default():
    ….print(‘Выполняем что-то для других значений\n’)

    #
    # сам словарь

    options = {0 : zero, 1: sqr, 4: sqr, 9: sqr, 2: even, 6: even, 8: even, 3: prime, 5: prime, 7: prime,}

    #
    # проверим для значений от 0 до 10 работу всего этого «заменителя» if — elif — else:

    for x in range(11):
    ….print(‘Рассматриваю число:’, x)
    ….try:
    ……..options[x]()
    ….except KeyError:
    ……..process_default()

    # try — except необходим для исключения ситуации, когда проверяемого значения (ключа в словаре) нет (это если необходимо)

    Результат:

    Рассматриваю число: 0
    Это просто нуль.
    Рассматриваю число: 1
    Это квадрат
    ………
    Рассматриваю число: 9
    Это квадрат
    Рассматриваю число: 10
    Выполняем что-то для других значений

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

      1. Володимир

        Спасибо.
        Хотел немного дополнить пример, потому как он не совсем полный.
        (вклю’чить или нет этот пример в комметнарий на Ваше усмотрение, конечно же)

        К предыдущему примеру:
        А вот если, напрмер к цифре 4 надо проделать одновременно несколько разных операций? Например вывести, что 1) это число — квадрат и 2) это число чётное.

        Опишем, что мы надо сообщать для каждого значения:

        zero = … print(‘Это просто нуль’)
        sqr = … print(‘Это квадрат’)
        even = … print(‘Это чётное число’)
        prime = … print(‘Это простое число’)
        default = … print(‘Выполняем что-то для других значений’)

        Тогда опишем словарь options c функцими в качестве значений по ключу так:

        options = {0: (zero, sqr),
        ….1: (sqr,),
        ….2: (prime, even),
        ….3: (prime,),
        ….4: (sqr, even),
        ….5: (prime,),
        ….6: (even,),
        ….7: (prime,),
        ….8: (even,),
        ….9: (sqr,)}

        Обратите внимание, значения ключей в словаре — это кортежи: .. 1: (sqr,) ..
        а также для некоторых ключей словаря я описал в кортеже несколько значений: .. 2: (prime, even), ..

        Например:
        — для значения 0 мне должно сообщить, что 1) это нуль и 2) это квадрат
        — для значения 2 мне должно сообщить, что 1) это простое число и 2) это чётное число
        — для значения 4 мне должно сообщить, что 1) это квадрат числа 2) это чётное число

        («Квадрат» здесь имеется ввиду идеальный квадрат, т.е. 0 == 0**2, 4 == 2**2. 9 == 3**2)

        Ну и конечно же, надо чтоб эти функции (zero, sqr, …) были описаны с реализацией.
        Дальше по урокам станет понятно, как это и что, а пока вот так запишем наши функции (перед определением словаря):

        zero = lambda: print(‘Это просто нуль’)
        sqr = lambda: print(‘Это квадрат’)
        even = lambda: print(‘Это чётное число’)
        prime = lambda: print(‘Это простое число’)
        default = lambda: print(‘Выполняем что-то для других значений’)

        options = {0: (zero, sqr),
        ….1: (sqr,),
        ….2: (prime, even,),
        ……..
        ….9: (sqr,)}

        # проверим для значения 2

        num = 2
        print(‘Про число’, num, ‘можно сказать следующее:’)
        try:
        for option in options[num]:
        option()
        except KeyError:
        default()

        Результат просто замечательный, для числа «2» выводится два сообщения по двум значениям: и even, и prime:

        Про число 2 можно сказать следующее:
        Это простое число
        Это чётное число

        ..что и требовалось :)) Всем успехов!

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

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

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

×