Python-рецепты. Словари.


Приветствую читателей моего блога. Сегодня рассмотрим средства и способы работы со словарями в python.

Для начала определимся что такое словарь (среди php-программистов принято говорить ассоциативный массив). Словарь – это набор объектов, к каждому из которых можно обратиться с помощью ключа (индексного имени или хеша). Словарь является удобным инструментом хранения и обработки данных произвольной структуры. Для обработки элементов словаря можно применять циклы и прямое обращение по индексу.

Давайте же перейдем к практике и набор этих заумных слов и определений обретет конкретный смысл :)

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

# создадим пустой словарь
data = {}

# или так
data = dict()

# определим его длину - 0
len(data)

# заполним данными - имя и фамилия
data = {'firstname': 'Vasya', 'lastname': 'Pupkin'}

# длина словаря определяется количеством ключей
# на данный момент - 2
len(data)

# добавим отчество
data['middlename'] = 'Vasilyevich'

# после женитьбы Васи обновляем поле фамилии и добавляем банковский счет
data.update({'lastname':'Gates', 'bank_account': 10000000})

# добавляем новым элементом словарь с данными жены...
data['wife'] = {'firstname': 'Annet', 'lastname': 'Gates', 'middlename': 'Billovna'}

# ... и загоняем в гараж приданое
data['garage'] = ['Jaguar', 'Toyota Camry']

# и еще одну машинку
data['garage'].append('Honda Civic')

# узнаем имя жены - Annet
print data['wife']['firstname']

# Вася хвастается друзьям
print data['bank_account']

# если нет элемента с нужным ключом,
# можно избежать ошибки
if 'bank_account' in data:
    print data['bank_account']
else:
    print 'no money'

# или так
print data.get('bank_account', 0)

# закрываем счет
del data['bank_account']

# распечатываем досье
for key in data:
    print key, ':', data[key]

#### после распечатки выдаст следующее
# firstname : Vasya
# wife : {'middlename': 'Billovna', 'lastname': 'Gates', 'firstname': 'Annet'}
# middlename : Vasilyevich
# lastname : Gates
# garage : ['Jaguar', 'Toyota Camry', 'Honda Civic']

#### а само досье выглядит так
# {'firstname': 'Vasya', 'wife': {'middlename': 'Billovna', 'lastname': 'Gates',
# 'firstname': 'Annet'}, 'middlename': 'Vasilyevich', 'lastname': 'Gates',
# 'garage': ['Jaguar', 'Toyota Camry', 'Honda Civic']}

Вот пожалуй и все.

, ,



  1. #1 by Иван on 13 Апрель 2012 - 14:36

    Нет, не все. :)
    Еще можно создавать словари так:
    dict(firstname = ‘Vasya’, lastname = ‘Pupkin’)
    и так:
    keys = ['firstname', 'lastname']
    vals1 = ['Vasya', 'Pupkin']
    vals2 = ['Annet', 'Gates']
    dict1 = dict(keys, vals1)
    dict2 = dict(keys, vals2)
    или даже так:
    data = dict([['firstname', 'Vasya'], ['lastname', 'Pupkin']]}
    еще есть замечательный класс-метод dict.fromkeys()

    очистка словаря
    data.clear()

    очень удобные для циклов
    iteritems, iterkeys, itervalues

    еще есть setdefault, pop, popitem и еще кое-какие интересные фишки, например, то, что ключами могут быть любые хешируемые объекты, например, это корректно:
    mydict = {(0,0):’a',(‘b’,1):2}

    А еще в словарь можно складывать любые объекты, например, иногда удобно делать что-то вроде:
    fndict = {‘year’: lambda s: int(s) , ‘name’: lambda s: s.title()}
    src = [['1982','вася'],['1985','annet']]
    res = {fndict['name'](item[1]): fndict['year'](item[0]) for item in src}
    для разбора CSV, где порядок столбцов может меняться от файла к файлу.

  2. #3 by vladimir on 16 Апрель 2012 - 21:23

    странно Вася, после женитьбы сменил фамилию :) вот, если бы это была Васильевна и она вышла замуж… :)

    ну а по существу, в доках же все это есть

(никто не узнает)