Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чаплыгин А.Н. Учимся програмировать вместе с Пи...doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
3 Мб
Скачать
☆

§10.4. Использование псевдонимов и копирование

Так как словари могут быть изменены, необходимо знать о псевдонимах. Всякий раз, когда две переменные ссылаются на один и тот же объект, изменения одной воздействуют на другую.

[TODO: стековая диаграмма]

Если вы хотите изменить словарь и сохраняете копию оригинала, используйте метод сору (). Например, opposites - словарь, который содержит пары антонимов:

>»

opposites = {'up': 'down',

'right':

'wrong',

'true':

'false

}

>»

alias = opposites

>»

copy = opposites.copy()

Переменные alias и opposites ссылаются на один и тот же объект; переменная сору () ссылается на только что созданную копию того же словаря. Если мы изменим псевдонимы, opposites так же изменится.

>» alias [ 'right' ] = 'left'

>» opposites ['right' ]

'left'

Если мы изменим copy, то словарь, opposites останется прежним.

>»

сору['

right

'] =

privi

lege'

>»

opposn

.tes [ '

right

]

Че

ft'

§10.5. Разряженные матрицы

В разделе 8.14 для представления матрицы мы использовали список списков. Это хороший выбор для матрицы содержащей в основном не нулевые значения, но рассмотрим разряженную матрицу подобную этой:

88

Ревизия: 170

Словари

0

0

0

1

0

0

0

0

0

0

0

2

0

0

0

0

0

0

0

0

0

0

0

3

0

Представление в виде списка содержит множество нулей:

>» matrixl =

= [ [0,0,0,1,0],

[0,0,0,0,0],

[0,2,0,0,0],

[0,0,0,0,0],

[0,0,0,3,0] ]

Но есть и другой способ хранения матриц - мы можем использовать словарь: ключами будут кортежи, хранящие номер строки и номер столбца. Вот представление той же матрицы в виде словаря:

>» matrix2 = { (0,3) : 1, (2, 1) : 2, (4, 3) : 3}

Нам необходимо только три пары ключ-значение, одной для каждого ненулевого элемента матрицы. Каждый ключ - кортеж и каждое значение целое число.

Для доступа к элементу матрицы мы могли использовать оператор индексирования:

>»

matrixl[0][3]

1

>»

matrix2[0,

3]

1

Обратите внимание синтаксис для представления в виде словаря не такой как для представления в виде вложенных списков. Вместо двух целочисленных индексов мы используем один индекс - кортеж целых чисел.

Но в таком подходе есть одна сложность. Если мы укажем на нулевой элемент, мы получим ошибку, так как в словаре нет элемента с таким ключом:

>» matrix2 [1,3] KeyError: (l, 3)

Данную проблему решает метод get () :

>» matrix, get ( (0, 3) , 0)

1

Первый аргумент- ключ, второй аргумент- значение, которое get() должен возвратить, если такого ключа в словаре нет:

>» matrix, get ( (1, 3) , 0)

0

get definitely improves the semantics of accessing a sparse matrix. Shame about the syntax. Метод get определенно улучшает семантику доступа к разряженной матрице.

89

Ревизия: 170

Словари