Словари

Словарь содержит пары ключ - значение (их порядок несущественен). Это один из наиболее полезных и часто используемых типов данных в питоне.

In [1]:
d={'one':1,'two':2,'three':3}
d
Out[1]:
{'one': 1, 'three': 3, 'two': 2}

Можно узнать значение, соответствующее некоторому ключу. Словари реализованы как хэш-таблицы, так что поиск даже в больших словарях очень эффективен. В языках низкого уровня (например, C) для построения хэш-таблиц требуется использовать внешние библиотеки и писать заметное количество кода. В скриптовых языках (perl, python, php) они уже встроены в язык, и использовать их очень легко.

In [2]:
d['two']
Out[2]:
2
In [3]:
d['four']
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-3-a0944cd0c15b> in <module>()
----> 1 d['four']

KeyError: 'four'

Можно проверить, есть ли в словаре данный ключ.

In [4]:
'one' in d, 'four' in d
Out[4]:
(True, False)

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

In [5]:
d['one']=-1
d
Out[5]:
{'one': -1, 'three': 3, 'two': 2}
In [6]:
d['four']=4
d
Out[6]:
{'four': 4, 'one': -1, 'three': 3, 'two': 2}

Длина - число ключей в словаре.

In [7]:
len(d)
Out[7]:
4

Можно удалит ключ из словаря.

In [8]:
del d['two']
d
Out[8]:
{'four': 4, 'one': -1, 'three': 3}

Метод get, если он будет вызван с отсутствующим ключом, не приводит к ошибке, а возвращает специальный объект None. Он используется всегда, когда необходимо указать, что объект отсутствует (в какой-то мере он аналогичен null в C). Если передать методу get второй аргумент - значение по умолчанию, то будет возвращаться это значение, а не None.

In [9]:
d.get('one'),d.get('five')
Out[9]:
(-1, None)
In [10]:
type(None)
Out[10]:
NoneType
In [11]:
d.get('one',0),d.get('five',0)
Out[11]:
(-1, 0)

Словари обычно строят последовательно: начинают с пустого словаря, а затем добавляют ключи со значениями.

In [12]:
d={}
d
Out[12]:
{}
In [13]:
d['zero']=0
d
Out[13]:
{'zero': 0}
In [14]:
d['one']=1
d
Out[14]:
{'one': 1, 'zero': 0}

А это генератор словаря (dictionary comprehension).

In [15]:
d={i:i**2 for i in range(5)}
d
Out[15]:
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Ключами могут быть любые неизменяемые объекты, например, целые числа, строки, кортежи.

In [16]:
d={}
d[0,0]=1
d[0,1]=0
d[1,0]=0
d[1,1]=-1
d
Out[16]:
{(0, 0): 1, (0, 1): 0, (1, 0): 0, (1, 1): -1}
In [17]:
d[0,0]+d[1,1]
Out[17]:
0

Словари, подобно спискам, можно использовать в for циклах. Перебираются имеющиеся в словаре ключи (в каком-то непредсказуемом порядке).

In [18]:
d={'one':1,'two':2,'three':3}
for x in d:
    print(x,'  ',d[x])
one    1
two    2
three    3

Метод keys возвращает список ключей, метод values - список соответствующих значений (в том же порядке), а метод items - список пар (ключ,значение). Точнее говоря, это не списки, а некоторые объекты, которые можно использовать в for циклах или превратить в списки функцией list. Если хочется написать цикл по упорядоченному списку ключей, то можно использовать sorted(d.keys)).

In [19]:
d.keys(),d.values(),d.items()
Out[19]:
(dict_keys(['one', 'two', 'three']),
 dict_values([1, 2, 3]),
 dict_items([('one', 1), ('two', 2), ('three', 3)]))
In [20]:
for x in sorted(d.keys()):
    print(x,'  ',d[x])
one    1
three    3
two    2
In [21]:
for x,y in d.items():
    print(x,'  ',y)
one    1
two    2
three    3
In [22]:
del x,y

Что есть истина? И что есть ложь? Подойдём к этому философскому вопросу экспериментально.

In [23]:
bool(False),bool(True)
Out[23]:
(False, True)
In [24]:
bool(None)
Out[24]:
False
In [25]:
bool(0),bool(123)
Out[25]:
(False, True)
In [26]:
bool(''),bool(' ')
Out[26]:
(False, True)
In [27]:
bool([]),bool([0])
Out[27]:
(False, True)
In [28]:
bool(set()),bool({0})
Out[28]:
(False, True)
In [29]:
bool({}),bool({0:0})
Out[29]:
(False, True)

На варажения, стоящие в булевых позициях (после if, elif и while), неявно напускается функция bool. Некоторые объекты интерпретируются как False: число 0, пустая строка, пустой список, пустое множество, пустой словарь, None и некоторые другие. Все остальные объекты интерпретируются как True. В операторах if или while очень часто используется список, словарь или что-нибудь подобное, что означает делай что-то если этот список (словарь и т.д.) не пуст.

Заметим, что число с плавающей точкой 0.0 тоже интерпретируется как False. Это использовать категорически не рекомендуется: вычисления с плавающей точкой всегда приближённые, и неизвестно, получите Вы 0.0 или 1.234E-12. Лучше напишите if abs(x)<epsilon:.