🐍 Словари в Python: 5 задач с решениями для изучения генераторов и методов словарей

Решение этих задач поможет изучить и запомнить, как правильно использовать генераторы, а также основные методы словарей — fromkeys, setdefault и get.
🐍 Словари в Python: 5 задач с решениями для изучения генераторов и методов словарей

Повторы слов

Напишите программу, которая принимает на вход строку текста и подсчитывает количество повторов всех слов с учетом регистра и позиции в строке.

Формат ввода

Текстовая строка. Слова разделены пробелами, знаков препинания нет.

Формат вывода

Для каждого слова из введенной строки программа выводит одно целое число — количество повторов этого слова в тексте с учетом позиции и регистра. Числа выводятся на одной строке, через пробел.

Пример ввода:

        прием Хьюстон Хьюстон как слышно прием меня слышно прием хьюстон Хьюстон у нас проблема
    

Вывод:

        1 1 2 1 1 2 1 2 3 1 3 1 1 1
    

Решение

Способ 1:

        d = {}
for i in input().split():
    d[i] = d.get(i, 0) + 1
    print(d[i], end=' ')

    

Способ 2:

        my_dict = {}
for i in input().split(' '):
    my_dict[i] = my_dict.setdefault(i, 0) + 1
    print(my_dict[i], end=' ') 

    

Способ 3:

        s = input().split()
d = dict.fromkeys(s, 1)
for i in s:
    print(d[i], end=' ')
    d[i] += 1

    
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»

Словарь начинающего разработчика

Программисты в общении между собой часто используют профессиональный сленг. Напишите программу, которая помогает «войтивайтишникам» разобраться в значении сленговых выражений.

Формат ввода

В первой строке подается целое число n — количество слов в словаре. В следующих n строках записаны слова и их определения, разделенные двоеточием и символом пробела. В последующей строке подается целое число m — количество поисковых слов. Затем в m строках даются слова, для которых нужно вывести определение из созданного словаря.

Формат вывода

Для каждого слова, если оно присутствует в словаре, необходимо вывести определение. Регистр не учитывается. Если слова в словаре нет, программа должна вывести Не найдено.

Пример ввода:

        7
Бэкенд: программно-аппаратная или серверная часть приложения
Бэкап: резервная копия или процесс создания резервной копии приложения
Галера: компания, в которой платят низкие зарплаты и не ценят разработчиков
Гит: система контроля версий Git или сервис GitHub
Г***окод: плохой, некачественный код
Жаба: язык программирования Java
Жабаскрипт: язык программирования JavaScript
6
Жаба
Змея
Костыль
Бета
БЭКЕНД
Г***окод
    

Вывод:

        язык программирования Java
Не найдено
Не найдено
Не найдено
программно-аппаратная или серверная часть приложения
плохой, некачественный код

    

Решение

Способ 1:

        d = {k.lower(): v for _ in range(int(input())) for k, v in [input().split(': ', 1)]}
print(*(d.get(input().lower(), 'Не найдено') for _ in range(int(input()))), sep='\n')

    

Способ 2:

        prog = {}
for _ in range(int(input())):
    descr = input().split(': ')
    prog[descr[0].lower()] = descr[1]
for _ in range(int(input())):
    print(prog.get(input().lower(), 'Не найдено'))

    

Способ 3:

        n = int(input())
lib = {j[0].lower(): j[1] for j in [input().split(': ') for i in range(n)]}
for request in range(int(input())):
    print(lib.get(str(input()).lower(), 'Не найдено'))

    

Справочник

На вход программе подается список стран и городов каждой страны. Затем даны названия городов. Напишите программу, которая определяет, в какой стране расположен город.

Формат ввода

Программа получает на вход количество стран n, а затем – n строк. Каждая строка начинается с названия страны, затем идут названия городов этой страны. В следующей строке записано число m, далее идут m запросов — названия некоторых из m городов, заданных выше.

Формат вывода

Программа должна вывести название страны, в которой находится город, указанный в запросе.

Пример ввода:

        2
Германия Берлин Мюнхен Гамбург Дортмунд
Нидерланды Амстердам Гаага Роттердам Алкмар
4
Амстердам
Алкмар
Гамбург
Гаага

    

Вывод:

        Нидерланды
Нидерланды
Германия
Нидерланды

    

Решение

Способ 1:

        d = {}
for _ in range(int(input())):
    country, *cities = input().split()
    d.update(dict.fromkeys(cities, country))
for _ in range(int(input())):    
    print(d[input()])

    

Способ 2:

        d = {}
for _ in range(int(input())):
    country, *cities = input().split()
    for c in cities:
        d[c] = country
for _ in range(int(input())):
    print(d[input()])

    

Способ 3:

        d = {i : j for _ in range(int(input())) for i, *j in  [input().split()]}
[print(k) for _ in range(int(input())) for i in [input()] for k, v in d.items() if i in v]

    

Телефонная книга

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

Формат ввода

В первой строке подается одно целое число n — количество номеров телефонов, информацию о которых Вася сохранил в телефонной книге. В следующих n строках заданы телефоны и имена их владельцев через пробел. Затем подается целое число m — количество поисковых запросов от Васи. В последующих m строках записаны сами запросы, по одному на строке. Каждый запрос — это имя друга, чьи номера Вася хочет найти.

Формат вывода

Для каждого запроса нужно вывести на отдельных строках все телефонные номера, принадлежащие человеку с этим именем, независимо от регистра имени. Если в телефонной книге нет телефонов человека с таким именем, выведите в соответствующей строке абонент не найден. При этом номера, принадлежащие одному человеку, нужно вывести в одну строку через пробел в том порядке, в каком они были заданы во входных данных.

Пример ввода:

        3
79184219577 Саша
79194249271 Кирилл
79281234567 Саша
3
Кирилл
Саша
Егор
    

Вывод:

        79194249271
79184219577 79281234567
абонент не найден

    

Решение

Способ 1:

        d = {}
for _ in range(int(input())):
    phone, name = input().split()
    d.setdefault(name, []).append(phone)
for _ in range(int(input())):
    print(*d.get(input(), ['абонент не найден']))

    

Способ 2:

        book = {}
for _ in range(int(input())):
    line = input().split()
    if line[1] not in book:
        book[line[1]] = [line[0]]
    else:
        book[line[1]].append(line[0])
for _ in range(int(input())):
    print(*book.get(input(), (['абонент не найден'])))

    

Способ 3:

        dct = {}
[dct.setdefault(owner, []).append(num) for _ in range(int(input())) for num, owner in [input().split()]]
[print(*dct.get(input(), ['абонент не найден'])) for _ in range(int(input()))]

    

Футбол

Напишите программу, которая получает на вход список игр футбольных команд с результатом матча и выводит сводную таблицу результатов всех матчей. За победу команде начисляется 3 очка, за поражение — 0, за ничью — 1.

Формат ввода

В первой строке указано целое число n — количество завершенных игр.

После этого идут n строк, в которых записаны результаты игры в следующем формате:

Первая_команда;Забито_первой_командой;Вторая_команда;Забито_второй_командой

Формат вывода

Программа должна выводить результаты матчей по каждой команде:

Команда:Всего_игр Побед Ничьих Поражений Всего_очков

Пример ввода:

        3
Спартак;9;Зенит;10
Локомотив;12;Зенит;3
Спартак;8;Локомотив;15

    

Вывод:

        Спартак:2 0 0 2 0
Зенит:2 1 0 1 3
Локомотив:2 2 0 0 6

    

Решение

Способ 1:

        a = [input().split(';') for i in range(int(input()))]
b = {i:[] for i in set([i[0] for i in a])|set([i[2] for i in a])}
for i in a:
                b[i[0]].append(1 if i[1]==i[3] else 3 if i[1]>i[3] else 0)
                b[i[2]].append(1 if i[1]==i[3] else 3 if i[1]<i[3] else 0)
for i in b: print(f'{i}:{len(b[i])} {b[i].count(3)} {b[i].count(1)} {b[i].count(0)} {sum(b[i])}')

    

Способ 2:

        d = {}
for a, p, b, v in (input().split(';') for n in range(int(input()))):
    d[a] = [i + j for i, j in zip(d.setdefault(a, [0, 0, 0, 0, 0]), [1, (p > v), (p == v), (p < v), 3 if p > v else (p == v)])]
    d[b] = [i + j for i, j in zip(d.setdefault(b, [0, 0, 0, 0, 0]), [1, (p < v), (p == v), (p > v), 3 if p < v else (p == v)])]
print(*(i+":" + ' '.join(map(str, d.get(i))) for i in d), sep='\n')

    

Способ 3:

        d = {}
for game in range(int(input())):
    c1, r1, c2, r2 = input().split(';')
    r1, r2 = int(r1), int(r2)
    r1, r2 = 3 * (r1 > r2) + (r1 == r2), 3 * (r2 > r1) + (r1 == r2)
    r1, r2 =  [[1, int(_ == 3), int(_ == 1), int(_ == 0), _] for _ in (r1, r2)]
    d[c1] = [sum(_) for _ in zip(d.get(c1, [0, 0, 0, 0, 0]), r1)]
    d[c2] = [sum(_) for _ in zip(d.get(c2, [0, 0, 0, 0, 0]), r2)]
[print(k, ' '.join(map(str, v)), sep=':') for k, v in d.items()] 

    
***

Материалы по теме




МЕРОПРИЯТИЯ

Комментарии

ВАКАНСИИ

Добавить вакансию

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ