Введение
В этом разделе представлены структуры данных в виде кортежей и словарей.
This tutorial is from open-source community. Access the source code
💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал
В этом разделе представлены структуры данных в виде кортежей и словарей.
В Python есть несколько примитивных типов данных:
Мы узнали об этих типах данных в разделе Введение.
email_address = None
None
часто используется в качестве заполнителя для необязательного или отсутствующего значения. В условных выражениях оно оценивается как False
.
if email_address:
send_email(email_address, msg)
Реальные программы работают с более сложными данными. Например, информация о портфеле акций:
100 shares of GOOG at $490.10
Это "объект", состоящий из трех частей:
Кортеж - это коллекция значений, объединенных вместе.
Пример:
s = ('GOOG', 100, 490.1)
Иногда скобки ()
опускаются в синтаксисе.
s = 'GOOG', 100, 490.1
Особые случаи (пустой кортеж, кортеж из одного элемента).
t = () ## Пустой кортеж
w = ('GOOG', ) ## Кортеж с одним элементом
Кортежи часто используются для представления простых записей или структур. Как правило, это единый объект, состоящий из нескольких частей. Хорошая аналогия: Кортеж - это как одна строка в таблице базы данных.
Содержимое кортежа упорядочено (как массив).
s = ('GOOG', 100, 490.1)
name = s[0] ## 'GOOG'
shares = s[1] ## 100
price = s[2] ## 490.1
Однако содержимое нельзя изменить.
>>> s[1] = 75
TypeError: object does not support item assignment
Однако можно создать новый кортеж на основе текущего кортежа.
s = (s[0], 75, s[2])
Кортежи больше связаны с объединением связанных элементов в единый объект.
s = ('GOOG', 100, 490.1)
Затем кортеж легко передается в другие части программы в качестве единого объекта.
Для использования кортежа в других местах можно распаковать его части в переменные.
name, shares, price = s
print('Cost', shares * price)
Количество переменных слева должно соответствовать структуре кортежа.
name, shares = s ## ERROR
Traceback (most recent call last):
...
ValueError: too many values to unpack
Кортежи похожи на неизменяемые списки. Однако, кортежи чаще всего используются для единого элемента, состоящего из нескольких частей. Списки обычно представляют собой коллекцию различных элементов, обычно всех одного типа.
record = ('GOOG', 100, 490.1) ## Кортеж, представляющий запись в портфеле
symbols = [ 'GOOG', 'AAPL', 'IBM' ] ## Список, представляющий три символа акций
Словарь - это сопоставление ключей со значениями. Иногда его также называют хеш-таблицей или ассоциативным массивом. Ключи служат индексами для доступа к значениям.
s = {
'name': 'GOOG',
'shares': 100,
'price': 490.1
}
Для получения значений из словаря используйте имена ключей.
>>> print(s['name'], s['shares'])
GOOG 100
>>> s['price']
490.10
>>>
Для добавления или изменения значений используйте присвоение по именам ключей.
>>> s['shares'] = 75
>>> s['date'] = '6/6/2007'
>>>
Для удаления значения используйте оператор del
.
>>> del s['date']
>>>
Словари полезны, когда есть много различных значений, и эти значения могут быть изменены или обработаны. Словарные структуры делают ваш код более читаемым.
s['price']
## по сравнению с
s[2]
В нескольких последних упражнениях вы писали программу, которая читала файл с данными portfolio.csv
. С использованием модуля csv
легко читать файл построчно.
>>> import csv
>>> f = open('portfolio.csv')
>>> rows = csv.reader(f)
>>> next(rows)
['name','shares', 'price']
>>> row = next(rows)
>>> row
['AA', '100', '32.20']
>>>
Хотя чтение файла простое, часто требуется делать с данными больше, чем просто читать их. Например, вы, возможно, хотите сохранить их и начать выполнять над ними некоторые вычисления. К сожалению, простая "строка" данных не дает достаточно информации для работы. Например, даже простое математическое вычисление не работает:
>>> row = ['AA', '100', '32.20']
>>> cost = row[1] * row[2]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: can't multiply sequence by non-int of type'str'
>>>
Для более глубокой обработки данных вы обычно хотите как-то интерпретировать исходные данные и превратить их в более полезный тип объекта, чтобы потом с ними работать. Два простых варианта - это кортежи или словари.
В интерактивном режиме создайте следующий кортеж, представляющий вышеуказанную строку, но с числовыми столбцами, преобразованными в соответствующие числа:
>>> t = (row[0], int(row[1]), float(row[2]))
>>> t
('AA', 100, 32.2)
>>>
С использованием этого кортежа вы можете теперь вычислить общую стоимость, умножив количество акций на цену:
>>> cost = t[1] * t[2]
>>> cost
3220.0000000000005
>>>
Математика сломана в Python? Что с этим ответом 3220.0000000000005?
Этоartifact работы с плавающей запятой в вашем компьютере, которая может точно представлять десятичные дроби в системе счисления по основанию 2, а не 10. При даже простых вычислениях, связанных с десятичными дробями по основанию 10, возникают небольшие ошибки. Это нормально, хотя может быть несколько удивительно, если вы раньше этого не видели.
Это происходит во всех языках программирования, которые используют плавающие десятичные числа, но это часто скрывается при печати. Например:
>>> print(f'{cost:0.2f}')
3220.00
>>>
Кортежи являются неизменяемыми. Проверьте это, попытаясь изменить количество акций на 75.
>>> t[1] = 75
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
Хотя вы не можете изменить содержимое кортежа, вы всегда можете создать совершенно новый кортеж, который заменит старый.
>>> t = (t[0], 75, t[2])
>>> t
('AA', 75, 32.2)
>>>
Когда вы переприсваиваете существующее имя переменной так, старое значение отбрасывается. Хотя вышеуказанная инструкция присваивания может выглядеть так, будто вы изменяете кортеж, на самом деле вы создаете новый кортеж и выбрасываете старый.
Кортежи часто используются для упаковки и распаковки значений в переменные. Попробуйте следующее:
>>> name, shares, price = t
>>> name
'AA'
>>> shares
75
>>> price
32.2
>>>
Возьмите переменные выше и упакуйте их обратно в кортеж
>>> t = (name, 2*shares, price)
>>> t
('AA', 150, 32.2)
>>>
Вместо кортежа можно создать словарь.
>>> d = {
'name' : row[0],
'shares' : int(row[1]),
'price' : float(row[2])
}
>>> d
{'name': 'AA','shares': 100, 'price': 32.2 }
>>>
Вычислите общую стоимость этой активации:
>>> cost = d['shares'] * d['price']
>>> cost
3220.0000000000005
>>>
Сравните этот пример с тем же вычислением, которое использовалось для кортежей выше. Измените количество акций на 75.
>>> d['shares'] = 75
>>> d
{'name': 'AA','shares': 75, 'price': 32.2 }
>>>
В отличие от кортежей, словари можно свободно изменять. Добавьте некоторые атрибуты:
>>> d['date'] = (6, 11, 2007)
>>> d['account'] = 12345
>>> d
{'name': 'AA','shares': 75, 'price':32.2, 'date': (6, 11, 2007), 'account': 12345}
>>>
Если вы преобразуете словарь в список, вы получите все его ключи:
>>> list(d)
['name','shares', 'price', 'date', 'account']
>>>
Аналогично, если вы используете инструкцию for
для итерации по словарю, вы получите ключи:
>>> for k in d:
print('k =', k)
k = name
k = shares
k = price
k = date
k = account
>>>
Попробуйте этот вариант, который выполняет поиск одновременно:
>>> for k in d:
print(k, '=', d[k])
name = AA
shares = 75
price = 32.2
date = (6, 11, 2007)
account = 12345
>>>
Вы также можете получить все ключи с помощью метода keys()
:
>>> keys = d.keys()
>>> keys
dict_keys(['name','shares', 'price', 'date', 'account'])
>>>
Метод keys()
немного необычен тем, что возвращает специальный объект dict_keys
.
Это оболочка над исходным словарем, которая всегда показывает вам текущие ключи - даже если словарь изменяется. Например, попробуйте это:
>>> del d['account']
>>> keys
dict_keys(['name','shares', 'price', 'date'])
>>>
Обратите внимание, что ключ 'account'
исчез из keys
, хотя вы не вызывали d.keys()
снова.
Более элегантный способ работать с ключами и значениями одновременно - использовать метод items()
. Это возвращает кортежи (ключ, значение)
:
>>> items = d.items()
>>> items
dict_items([('name', 'AA'), ('shares', 75), ('price', 32.2), ('date', (6, 11, 2007))])
>>> for k, v in d.items():
print(k, '=', v)
name = AA
shares = 75
price = 32.2
date = (6, 11, 2007)
>>>
Если у вас есть кортежи, такие как items
, вы можете создать словарь с использованием функции dict()
. Попробуйте:
>>> items
dict_items([('name', 'AA'), ('shares', 75), ('price', 32.2), ('date', (6, 11, 2007))])
>>> d = dict(items)
>>> d
{'name': 'AA','shares': 75, 'price':32.2, 'date': (6, 11, 2007)}
>>>
Поздравляем! Вы завершили лабораторную работу по типам данных и структурам данных. Вы можете практиковаться в выполнении других лабораторных работ в LabEx, чтобы улучшить свои навыки.