Следующая тема: БРу. Библиотека Pandas
Вернуться в раздел: Базовый Python
Вернуться в оглавление: Я.Практикум
8. Словари.
8.1 Введение
8.2 Словари - основы
8.3 Поиск и добавление элементов
Задание 1
Запишите в переменную walmart_price стоимость акции 'Walmart'. Для этого извлеките значение из словаря небезопасным способом.
financial_info = {
'American Express': 93.23,
'Boeing': 178.44,
'Coca-Cola': 45.15,
'Nike': 97.99,
'JPMorgan':96.27,
'Walmart': 130.68,
'Walt Disney': 119.34
}
walmart_price = financial_info['Walmart'] # напишите ваш код здесь
print(walmart_price)
Задание 2 Извлеките из словаря цену акций 'Nike' безопасным способом. В случае, если ключа нет, метод должен вернуть None.
financial_info = {
'American Express': 93.23,
'Boeing': 178.44,
'Coca-Cola': 45.15,
'Nike': 97.99,
'JPMorgan': 96.27,
'Walmart': 130.68,
'Walt Disney': 119.34
}
nike_price = financial_info.get('Nike') # напишите ваш код здесь
print(nike_price)
Задание 3
Добавьте в словарь financial_info новый элемент c ключом 'Microsoft' и значением — 208.35.
financial_info = {
'American Express': 93.23,
'Boeing': 178.44,
'Coca-Cola': 45.15,
'Nike': 97.99,
'JPMorgan': 96.27,
'Walmart': 130.68,
'Walt Disney': 119.34
}
# добавьте новую пару здесь
financial_info ['Microsoft'] = 208.35
print(financial_info)
8.4 Словари и списки
8.5 Список словарей
Задание 1
В списке словарей monuments описаны некоторые статуи. Выведите на экран их среднюю высоту. В решении должны быть использованы цикл и вызов функции len(). В цикле посчитайте только сумму высот всех статуй. А среднее значение рассчитайте и выведите на экран уже после цикла.
monuments = [
{
'name': 'Статуя Единства', # название
'country': 'Индия', # страна
'height': 182 # высота без постамента
},
{
'name': 'Статуя богини Каннон в Сендае',
'country': 'Япония',
'height': 100
},
{
'name': 'Родина-Мать зовёт!',
'country': 'Россия',
'height': 85
},
{
'name': 'Будда Дорденма',
'country': 'Бутан',
'height': 51.5
},
{
'name': 'Статуя Свободы',
'country': 'США',
'height': 46
}
]
# напишите ваш код здесь
H = 0
for item in monuments:
H += item['height']
print(H/len(monuments))
Задание 2
Исследуйте список order из урока: найдите общую стоимость всех пицц. Результат выведите на экран.
order = [
{
'item': 'Пицца Маргарита', # название позиции
'category': 'пицца', # категория товара
'quantity': 2, # количество в заказе
'comment': 'Побольше сыра, пожалуйста!', # комментарий к заказу
'price': 320 # стоимость одной единицы товара
},
{
'item': 'Пицца с ветчиной',
'category': 'пицца',
'quantity': 1,
'comment': '',
'price': 410
},
{
'item': 'Pepsi 1 л',
'category': 'напитки',
'quantity': 3,
'comment': '',
'price': 75
},
{
'item': 'Сок яблочный 0.5 л',
'category': 'напитки',
'quantity': 1,
'comment': '',
'price': 80
},
{
'item': 'Круассан с сыром',
'category': 'выпечка',
'quantity': 2,
'comment': '',
'price': 130
}
]
# напишите ваш код здесь
sum_pica = 0
for item in order:
if item['category'] == 'пицца':
sum_pica += item['price'] * item['quantity']
print (sum_pica)
8.6 Лаборатория словарей
Задача №1
В словаре arts_info ключи — названия картин, а значения — их авторы. Выведите на экран: Автора картины «Крик» — небезопасным способом. Автора картины «Рожь» — безопасным способом. Значением по умолчанию сделайте -1.
arts_info = {
'Звёздная ночь': 'Ван Гог Винсент',
'Крик': 'Мунк Эдвард',
'Неизвестная': 'Крамской Иван',
'Итальянский полдень': 'Брюллов Карл',
'Рожь': 'Шишкин Иван',
}
print(arts_info['Крик']) # допишите ваш код внутри print()
print(arts_info.get('Рожь', -1)) # допишите ваш код внутри print()
Задача №2
Три игрока лиги NBA считали заработанные очки в течение трёх лет. Результат сохранён в словаре списков nba_players. Создайте цикл, который: Пройдётся по элементам словаря методом items() и сложит очки каждого игрока с помощью функции sum(). Получит длину списка функцией len(). Выведет на экран имя игрока и среднее значение очков. Получить его можно, разделив суммы очков на длину списка. Например, для Леброна Джеймса цикл напечатает:
nba_players = {
'Джеймс Харден': [2191, 2818, 2335],
'Леброн Джеймс': [2251, 1505, 1698],
'Дэмиан Лиллард': [1962, 2067, 2009],
}
# напишите ваш код здесь
for playrs,nba in nba_players.items():
print (playrs, int(sum(nba)/len(nba)))
Задача №3
Список словарей tracklist содержит плейлист для вечеринки. Найдите суммарную длительность треков жанра Hip-Hop с помощью цикла.
tracklist = [
{
'title': 'Stronger', # название трека
'artist': 'Saimoo', # исполнитель
'duration': 145, # продолжительность (в секундах)
'genre': 'Deep House', # жанр
},
{
'title': 'Alors On Danse',
'artist': 'Stromae',
'duration': 205,
'genre': 'Hip-Hop',
},
{
'title': 'Don\'t Be So Shy',
'artist': 'Imany (Filatov & Karas Remix)',
'duration': 190,
'genre': 'Deep House',
},
{
'title': 'Off My Mind',
'artist': 'Matvey Emerson',
'duration': 130,
'genre': 'Deep House',
},
{
'title': 'Now You\'re Gone',
'artist': 'Basshunter',
'duration': 154,
'genre': 'Eurodance',
},
{
'title': 'It Was A Good Day',
'artist': 'Ice Cube',
'duration': 260,
'genre': 'Hip-Hop',
},
{
'title': 'Diva',
'artist': 'Beyonce',
'duration': 200,
'genre': 'Hip-Hop',
}
]
hip_hop_duration = 0
# напишите ваш код здесь
for track in tracklist:
if track['genre'] == 'Hip-Hop':
hip_hop_duration += track['duration']
print(hip_hop_duration)
Задача №4
Для того же списка словарей tracklist создайте отфильтрованный список словарей deep_house_tracklist, содержащий информацию только о треках с жанром Deep House. Не создавайте этот список вручную.
from json import dumps
tracklist = [
{
'title': 'Stronger',
'artist': 'Saimoo',
'duration': 145,
'genre': 'Deep House',
},
{
'title': 'Alors On Danse',
'artist': 'Stromae',
'duration': 205,
'genre': 'Hip-Hop',
},
{
'title': 'Don\'t Be So Shy',
'artist': 'Imany (Filatov & Karas Remix)',
'duration': 190,
'genre': 'Deep House',
},
{
'title': 'Off My Mind',
'artist': 'Matvey Emerson',
'duration': 130,
'genre': 'Deep House',
},
{
'title': 'Now You\'re Gone',
'artist': 'Basshunter',
'duration': 154,
'genre': 'Eurodance',
},
{
'title': 'It Was A Good Day',
'artist': 'Ice Cube',
'duration': 260,
'genre': 'Hip-Hop',
},
{
'title': 'Diva',
'artist': 'Beyonce',
'duration': 200,
'genre': 'Hip-Hop',
}
]
deep_house_tracklist = []
# напишите ваш код здесь
for track in tracklist:
if track['genre'] == 'Deep House':
deep_house_tracklist.append(track)
for track in deep_house_tracklist:
print(dumps(track, indent=4))
8.7 Заключение
Поздравляем, вы прошли большой путь и изучили основы языка Python. Не забудьте шпаргалку по словарям, чтобы ничего не упустить. Словари — важная структура данных. Эта тема полезна для понимания таблиц в библиотеке pandas, без которой не обходится работа специалиста в сфере данных. С этой библиотекой вы познакомитесь в следующей теме. Вы уже многому научились, и теперь нужно систематизировать полученные знания. В этом вам поможет карта — скачайте концепт-карту по пройденным урокам и проверьте, насколько хорошо вам знакомы все понятия.
8.8 Проверочные задания. Словари
Словари Чтобы пройти тест нужно правильно ответить на 5 вопросов из 10. Время на прохождение: 10 минут
Правильный ответ Словарь
В обычном англо-русском словаре по слову “dictionary” вы найдёте его русский перевод — «словарь». Так же и в словарях Python: по ключевому слову можно найти связанное с ним значение.
Задание 2 из 10
Какое значение выдаст код? movies = { 'Побег из Шоушенка': 1994, 'Крёстный отец': 1972, 'Тёмный рыцарь': 2008, 'Список Шиндлера': 1993 } print(len(movies))
Правильный ответ 4
Функция len() считает число элементов. У строк это символы, у списков — элементы списка, ими могут быть строки, числа и т. д. Элемент словаря — пара ключ:значение. В словаре movies таких пар 4. Это значение и выдаст функция len().
Задание 3 из 10
Какой код добавит новый элемент в словарь? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }
Правильный ответ books['Эрнест Хемингуэй'] = 'Прощай, оружие!'
Добавить новое значение в словарь просто — не понадобятся даже специальные методы. Новый ключ указывают в квадратных скобках и с помощью оператора = присваивают ему значение.
Задание 4 из 10
Из словаря info нужно извлечь значение по ключу city. Выберите безопасный способ, который точно не приведёт к ошибке.
Правильный ответ city_info = info.get('city') print(city_info)
Код info['city'] сработает, если в словаре будет такой ключ. Иначе придётся отлавливать ошибки с помощью try...except. Лучше использовать специальный метод get() — так лаконичнее. Вместо ошибки он выдаст None или любое другое значение, которое вы зададите.
Задание 5 из 10
Какое значение выведет код? items = { 'Пицца Маргарита': 3, 'Сок апельсиновый': 2, 'Картофель фри стандартный': 5 }
item = items.get('Пицца') print(item)
Правильный ответ None
Метод get() проверит, встречается ли такой ключ в словаре, и выдаст его значение. Но передать ключ нужно целиком — 'Пицца Маргарита'. Если передать только часть, метод значения не найдёт и выдаст None.
Задание 6 из 10
Какой результат выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }
Правильный ответ Ошибку
Казалось бы, если в цикле два итератора, то перебрать получится и ключ, и значение. Но такой код выдаст ошибку. Не хватает специального метода для словарей items(). Тогда цикл сможет перебрать имена писателей и названия произведений.
Задание 7 из 10
Какой результат выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }
Правильный ответ Дж. Оруэлл Лев Толстой Ральф Эллисон Антуан де Сент-Экзюпери
В этом случае можно обойтись и без метода items(). С перебором ключей справится цикл for с одним итератором. Но перебрать значения так не получится.
Задание 8 из 10
Что выдаст код? books = { 'Дж. Оруэлл': '1984', 'Лев Толстой': 'Война и мир', 'Ральф Эллисон': 'Человек-невидимка', 'Антуан де Сент-Экзюпери': 'Маленький принц' }
Правильный ответ Дж. Оруэлл 1984 Лев Толстой Война и мир Ральф Эллисон Человек-невидимка Антуан де Сент-Экзюпери Маленький принц
Метод items() поможет перебрать ключи и значения. Не забудьте, что в таком цикле два итератора.
Задание 9 из 10 Какой код найдёт общее количество страниц в книгах? books = [ { 'author': 'Дж. Оруэлл', 'book': '1984', 'page_count': 328 }, { 'author': 'Лев Толстой', 'book': 'Война и мир', 'page_count': 1225 }, { 'author': 'Ральф Эллисон', 'book': 'Человек-невидимка', 'page_count': 624 }, { 'author': 'Антуан де Сент-Экзюпери', 'book': 'Маленький принц', 'page_count': 96 } ]
Правильный ответ total_page_count = 0
Конструкцию со счётчиком вы встречали часто. Для списка словарей такая конструкция тоже подойдёт. Словари упорядочены в списке, поэтому их легко перебрать в цикле for. Для вызова значения из словаря индекс не нужен. Количество страниц можно вызвать по ключу 'page_count'. В этом преимущество списка словарей — удобно вызывать элементы и перебирать данные.
Задание 10 из 10
Какой метод добавит отступы и позволит красиво вывести словарь?
Правильный ответ json.dumps()
json.load()
С этой задачей справится метод json.dumps(). Отступ настраивают с помощью параметра indent. Если указать аргумент ensure_ascii=False, можно обработать кириллические символы.
Следующая тема: БРу. Библиотека Pandas
Вернуться в раздел: Базовый Python
Вернуться в оглавление: Я.Практикум