Python: списки и словари

Продолжаем учить язык программирования пайтон Python. Переходим к изучению 5 главы по книге: Майкл Доусон “Программируем на Python”, 2014 (Michael Dawson “Python Programming for the Absolute Beginner”, 3rd Edition), где освоим списки, списочные методы и словари.

Списки в Python

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

spisok=['раз', 'два', 'три','n']

Python: циклы for, константы, срезы, кортежи, последовательности len, range, in, choice

Как и в кортежах для списка можно узнать длину при помощи функции len(), можно делать перебор значений или запускать цикл for с помощью оператора in, делать срезы, проводить конкатенацию, находить элементы по индексам.

Изменение списка — это его основная фишка при сравнении с кортежами:

  • присвоить новое значение любому элементу: spisok[0]='кот'
  • присвоить новое значение срезу списка: spisok[0:2]='кот'
  • удалить элемент из списка: del spisok[0], при этом длина списка уменьшится;
  • аналогично можно удалить срез списка.

Списочные методы — расширения для управления списками:

  • добавить новый элемент в конец списка: spisok.append(переменная)
  • вставить элемент в конкретную позицию списка: spisok.insert(позиция, значение);
  • удалить элемент из списка: spisok.remove(переменная) при этом важно проверить, если ли удаляемый элемент в списке через условные конструкции;
  • сортировка списка:
    • spisok.sort по возрастанию;
    • spisok.sort(reverse=True) по убыванию;
  • подсчет количества раз повторения элемента в списке: spisok.count(переменная);
  • показать номер позиции в списке, где впервые встречается значение: spisok.index(переменная);
  • показать значение конкретной позиции списка и удалить его из списка:
    • spisok.pop([позиция]);
    • spisok.pop([]) – покажется и удалится последний элемент списка.

Вложенные списки — список организации данные, где внутри списков находятся не отдельные элементы, а списки или кортежи. Аналогично можно создать вложенный кортеж.

Общий вид вложенного списка:

vlojenniy_spisok=['раз', ['кот', 'медведь'], ('сыр', 'колбаса')]

Общий вид вызова элементов вложенных списков или кортежей:

print(vlojenniy_spisok[3][1])

Эта запись означает: покажи первый элемент третьего элемента списка: колбаса.

Распаковка последовательности — создание для каждого элемента из списка / кортежа своей переменной. Если есть список: spisok=['kot','eda'], то его распаковка будет выглядеть так: basya, miska = ['kot','eda'].

Словари в Python

Словари — это пары “ключ” и “значение” по аналогии с обычными словарями в реальной жизни.

Общий вид словаря:

slovar={'ключ_1':'значение_1',
        'ключ_2':'значение_2'}

Создать новую пару значений в словаре или заменить существующую:

slovar[ключ]=значение

Удалить пару значений из словаря:

del slovar[ключ]

Чтобы достать значение из словаря, нужно ввести ключ: slovar['ключ_1'], будет выведено 'значение_1'. Как и в случае удаление элементов из списка, при доставании значений из словаря сначала лучше проверить, если такой ключ в словаре или нет при помощи условных конструкций. 

Словарный методы:

  • get() — достает значение по ключу, а если ключа нет, то выдает значение None или любое другое заранее установленное значение, например slovar.get('ключ_3', 'Значение по умолчанию вместо None');
  • keys() — показывает все ключи словаря;
  • values() — показывает все значения словаря;
  • items() — показывает все пары ключей и значений в виде кортежей.

Игра “Что в моей сумке”

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

spisok_veshey=['карта','паспорт','ключи','телефон','ручка']
print('В вашей сумке находится:')
for i in spisok_veshey:
    print(i)
print('Общее количество предметов:',len(spisok_veshey))
index=int(input('Введите номер предмета и нажмите Entr \n'))
print('Под номером' ,index, 'находится', spisok_veshey[index])
print('Введите начальный и конечный индекс, чтобы увидеть \
содержимое среза вашей сумки')
index_nach=int(input('Начальный индекс: '))
index_kon=int(input('Конечный индекс: '))
print('В срезе вашей сумки',index_nach,':',index_kon, \
'находится:\n')
for i in spisok_veshey[index_nach:index_kon]:
    print(i)
print('\nВы нашли пакет с вещами в дропбоксе, в котором лежит:\n')
dropbox=['шапочка','варежки','платок']
for i in dropbox:
    print(i)
input('\nЧтобы положить вещи из дропбокс пакета в свою сумку, \
нажмите Entr')
spisok_veshey+=dropbox
print('\nТеперь в вашей сумке лежит:\n')
for i in spisok_veshey:
    print(i)
print('\nВам выпал шанс заменить любой предмет на любой другой')
new_predmet=input('Напишите, что вы хотите добавить в сумку\n')
index_new=int(input('Напишите номер предмета, вместо которого \
вы возьмете новый предмет\n'))
spisok_veshey[index_new]=new_predmet
print('\nТеперь в вашей сумке лежит:\n')
for i in spisok_veshey:
    print(i)
print('\nУ вас осталось немного денег, как раз хватит, чтобы \
купить волшебный пончик!')
input('Нажмите Entr, чтобы купить волшебный пончик')
new_item='волшебный пончик'
spisok_veshey.append(new_item)
print('\nТеперь в вашей сумке лежит:\n')
for i in spisok_veshey:
    print(i)
print('\nВу! На вас напал воришка и украл некоторые вещи!')
del spisok_veshey[:4]
print('\nВ вашей сумке осталось только:\n')
for i in spisok_veshey:
    print(i)

Вот так выглядит сама программа при ее запуске:

В вашей сумке находится:
карта
паспорт
ключи
телефон
ручка
Общее количество предметов: 5
Введите номер предмета и нажмите Entr 
4
Под номером 4 находится ручка
Введите начальный и конечный индекс, чтобы увидеть содержимое
среза вашей сумки
Начальный индекс: 1
Конечный индекс: 3
В срезе вашей сумки 1 : 3 находится:

паспорт
ключи

Вы нашли пакет с вещами в дропбоксе, в котором лежит:

шапочка
варежки
платок

Чтобы положить вещи из дропбокс пакета в свою сумку, нажмите Entr

Теперь в вашей сумке лежит:

карта
паспорт
ключи
телефон
ручка
шапочка
варежки
платок

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

Теперь в вашей сумке лежит:

карта
паспорт
ключи
телефон
пирожок
шапочка
варежки
платок

У вас осталось немного денег, как раз хватит, чтобы 
купить волшебный пончик!
Нажмите Entr, чтобы купить волшебный пончик

Теперь в вашей сумке лежит:

карта
паспорт
ключи
телефон
пирожок
шапочка
варежки
платок
волшебный пончик

Ву! На вас напал воришка и украл некоторые вещи!

В вашей сумке осталось только:

пирожок
шапочка
варежки
платок
волшебный пончик
>>> 

Ладдер игры

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

records={'Кот':'6',
         'Медведь':'3',
         'Барсук':'15'}
vibor=None
while vibor!=4:
    vibor=int(input('''"Ладдер игры".
1-Посмотреть ладдер
2-Добавить рекорд
3-Удалить рекорд
4-Выход
Ваш выбор?\n'''))
    if vibor==1:
        for i in records:
            print(i,':',records[i],'\n')
    elif vibor==2:
        new_record_name=input('Введите имя игрока\n')
        new_record_score=input('Введите рекорд\n')
        records[new_record_name]=new_record_score
        for i in records:
            print(i,':',records[i],'\n')
    elif vibor==3:
        delete_record=input('Введите имя игрока, чей \
рекорд нужно удалить.\n')
        if delete_record in records:
            del records[delete_record]
        else:
            print('Игрока с таким именем нет в ладдере')
        for i in records:
            print(i,':',records[i],'\n')
if vibor==4:
    input('Пока пока! Нажмите Entr, чтобы выйти.')

А вот так работает программа, когда ее запускаешь:

"Ладдер игры".
1-Посмотреть ладдер
2-Добавить рекорд
3-Удалить рекорд
4-Выход
Ваш выбор?
1
Кот : 6 

Медведь : 3 

Барсук : 15 

"Ладдер игры".
1-Посмотреть ладдер
2-Добавить рекорд
3-Удалить рекорд
4-Выход
Ваш выбор?
2
Введите имя игрока
Ласка
Введите рекорд
9
Кот : 6 

Медведь : 3 

Барсук : 15 

Ласка : 9 

"Ладдер игры".
1-Посмотреть ладдер
2-Добавить рекорд
3-Удалить рекорд
4-Выход
Ваш выбор?
3
Введите имя игрока, чей рекорд нужно удалить.
Кот
Медведь : 3 

Барсук : 15 

Ласка : 9 

"Ладдер игры".
1-Посмотреть ладдер
2-Добавить рекорд
3-Удалить рекорд
4-Выход
Ваш выбор?
4
Пока пока! Нажмите Entr, чтобы выйти.

В задании еще нужно было добавить возможность сортировать результаты во убыванию и по возрастанию. Но для этого нужно выполнять задачу через списки, а не через словари. Так как словарь нельзя просто так отсортировать через sort().

Игра “Виселица”

Задача: написать программу — игра “Виселица”, где компьютер выбирает неизвестное пользователю слово, игрок должен угадать это слово, предполагая наличие в слове разных букв. Игрок предлагает букву, если такой буквы нет в слове, то компьютер дорисовывает изображение. Если за ограниченное количество попыток игрок не угадает все слово, то он проиграет.

SLOVA=('кот','мяв','хрю')
import random
zag_slovo=random.choice(SLOVA)
otgad_slovo='*'*len(zag_slovo)
oshibki=0
isp_bukvi=[]
CAT=('''
.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏
''',
'''
.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏
┉╲╱╭▆╮┋╭▆╮╲╱┉┉╲╲
┉▕╲┉┉┉▅┉┉┉╱▏┉┉▕▕
''',
'''
.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏
┉╲╱╭▆╮┋╭▆╮╲╱┉┉╲╲
┉▕╲┉┉┉▅┉┉┉╱▏┉┉▕▕
┉▕┉▔▔╰┻╯▔▔┉▏┉┉╱╱
┉┈╲▂▂▂▂▂▂▂╱╲┉▕▕┉
┉┉╱╰╰╰╯╯╯╮╮╮╲╱╱┉
''')
MAX_OSHIBKI=len(CAT)-1
print('Игра "Виселица"')
while oshibki<MAX_OSHIBKI and otgad_slovo!=zag_slovo:
    print (CAT[oshibki])
    print('Загаданное слово:', otgad_slovo)
    print('Использованные варианты букв:', isp_bukvi)
    otgadka=input('Угадайте букву: ')
    otgadka=otgadka.lower()
    while otgadka in isp_bukvi:
        print('Вы уже предлагали букву',otgadka)
        otgadka=input('Угадайте букву: ')
        otgadka=otgadka.lower()
    isp_bukvi.append(otgadka)
    if otgadka in zag_slovo:
        print('Ура! Буква',otgadka,'есть в слове:')
        new=''
        for i in range(len(zag_slovo)):
            if otgadka == zag_slovo[i]:
                new+=otgadka
            else:
                new+=otgad_slovo[i]
        otgad_slovo=new
    else:
        print('Ошибочка! Буквы',otgadka,'нет в слове.')
        oshibki+=1
if oshibki == MAX_OSHIBKI:
    print(CAT[oshibki])
    print('Вы не успели отгадать слово и стали котом')
else:
    print('Ура! Вы угадали! Это слово:',zag_slovo)
input('Нажмите Entr для выхода из игры.')

А вот так выглядит игра “Виселица”, когда запускаешь программу:

Игра "Виселица"

.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏

Загаданное слово: ***
Использованные варианты букв: []
Угадайте букву: р
Ура! Буква р есть в слове:

.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏

Загаданное слово: *р*
Использованные варианты букв: ['р']
Угадайте букву: а
Ошибочка! Буквы а нет в слове.

.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏
┉╲╱╭▆╮┋╭▆╮╲╱┉┉╲╲
┉▕╲┉┉┉▅┉┉┉╱▏┉┉▕▕

Загаданное слово: *р*
Использованные варианты букв: ['р', 'а']
Угадайте букву: ю
Ура! Буква ю есть в слове:

.
▕▔▔╲▂▂▂▂▂╱▔▔▏┈┈┈
▕╲╱╱┋┋┋┋┋╲╲╱▏▕▔▏
┉╲╱╭▆╮┋╭▆╮╲╱┉┉╲╲
┉▕╲┉┉┉▅┉┉┉╱▏┉┉▕▕

Загаданное слово: *рю
Использованные варианты букв: ['р', 'а', 'ю']
Угадайте букву: х
Ура! Буква х есть в слове:
Ура! Вы угадали! Это слово: хрю
Нажмите Entr для выхода из игры.
>>> 

 

This entry was posted in Python. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *