Раздел «Язык Си».PythonDictTurtle:

Словари

Буква - цвет

Когда мы по букве кодировали цвет в задаче из Цвета по буквам

mycolors = ['blue', 'red', 'green', 'gold', 'violet', 'orange', 'yellow']
letters =  ['a',     'b',    'c',    'd',    'v',      'o',      'z']

Мы сначала находили номер буквы в списке letters, потом по этому номеру брали цвет в списке mycolors.

Это долго программировать и долго работает. Чем больше списки, тем дольше.

let = 'v'                          # как мы находили цвет для буквы v
for ilet in range(len(letters)):   # ilet (номер буквы) меняется от 0 до конца списка
    if letters[ilet] == let:       # если буква по этому номеру равна букве, которую ищем
        break                      #      закончить поиск

col = mycolors[ilet]               # взять цвет с таким же номером ilet

Хочется сразу по букве находить цвет. Для этого есть словари (dictionary).

Создадим словарь буква - цвет. Буква - это ключ (key), цвет - значение (value):

colors = {
    'a': 'blue',
    'b': 'red',
    'c': 'green',
    'd': 'gold',
    'v': 'violet',
    'o': 'orange',
    'z': 'yellow'
}

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

Когда нужно найти цвет по букве передаем не номер, а саму букву

c = colors['v']    # из словаря colors по букве 'v' взяли значение цвета
print(c)           # violet

Полное решение:

import turtle

def sq(x, y, size):
    t.pu()
    t.goto(x, y)
    t.pd()
    t.begin_fill()
    for i in range(4):
        t.fd(size)
        t.rt(90)
    t.end_fill()

def read_and_draw_1sq():
    x, y, size, a = input().split()
    x = int(x)
    y = int(y)
    size = int(size)
    
    t.color(dcolors[a])
    sq(x, y, size)
    
t = turtle.Turtle()
t.width(5)

# писали РАНЬШЕ списки
mycolors = ['blue', 'red', 'green', 'gold', 'violet', 'orange', 'yellow']
letters =  ['a',     'b',    'c',    'd',    'v',      'o',      'z']

# теперь пишем словарь
dcolors = {
    'a': 'blue',
    'b': 'red',
    'c': 'green',
    'd': 'gold',
    'v': 'violet',
    'o': 'orange',
    'z': 'yellow'
}

n = int(input())

for i in range(n):
    read_and_draw_1sq()

turtle.done()

Цена фруктов

Запишем цену килограмма фруктов по их названию. Сделаем словарь frut, где ключ - название фрукта, а значение - цена 1 килограмма этого фрукта.

Создаем словарь

fruit = {
    'apple': 50,
    'banana': 60,
    'orange': 60,
    'grape': 100,
    'mango': 80
}

Напечатаем весь словарь

print (fruit)

{'apple': 50, 'banana': 60, 'orange': 60, 'grape': 100, 'mango': 80}

Взять 1 значение из словаря

Узнаем цену бананов и манго:

bprice = fruit['banana']
print('banana', bprice)

print('mango', fruit['mango'])

Добавим еще один фрукт

fruit['pineapple'] = 150
print(fruit)

{'apple': 50, 'banana': 60, 'orange': 60, 'grape': 100, 'mango': 80, 'pineapple': 150}

Изменим цену уже существующего фрукта

fruit['apple'] = 70   # у 'apple' НОВОЕ значение 70, старого нет
print(fruit)

Получили

{'apple': 70, 'banana': 60, 'orange': 60, 'grape': 100, 'mango': 80, 'pineapple': 150}

in Есть такой фрукт в словаре?

x = 'apple'
if x in fruit:
    print('Есть в словаре')
else:
    print('НЕТ в словаре')

Создаем пустой словарь

d1 = {}
d2 = dict()

Задачи

Задача 0. По букве определить цвет квадрата

Перепишите пример, который определяет по буквам цвета и запустите его.

4
0 0 100 v
100 200 200 o
-50 -100 50 d
-350 200 300 z

Задача 1. Цвет заливки и цвет линии

Теперь для каждого квадрата зададим цвет заливки и цвет линии. Оба цвета кодируются буквами.

colors = {
    'a': 'blue',
    'b': 'red',
    'c': 'green',
    'd': 'gold',
    'v': 'violet',
    'o': 'orange',
    'z': 'yellow'
}

Входные данные:

4
0 0 100 v z
100 200 200 o c
-50 -100 50 d o
-350 200 300 z b

Отдельно назначить цвет линии и цвет заливки (линия красная, внутри квадрат желтый):

t.pencolor('red')
t.fillcolor('yellow')

kv_dict1.png

Задача 2. Сначала прочитать цвета

Даны сначала буквы и цвета. Потом даны квадраты. Нарисовать квадраты данными цветами.

8
a blue
b red
c green
d gold
v violet
o orange
z yellow
f brown
4
0 0 100 v a
100 200 200 o f
-50 -100 50 d c
-350 200 300 z b

dict2.png

Задача 3. Если нет буквы в словаре, рисуем серым

Даны сначала буквы и цвета. Потом даны квадраты. Нарисовать квадраты данными цветами.

Если у квадрата буква, которой нет в словаре, рисовать эту букву всегда серым (gray).

8
a blue
b red
c green
d gold
v violet
o orange
z yellow
f brown
4
0 0 100 v a
100 200 200 o f
-50 -100 50 w d
-350 200 300 z b

kv_dict3.png

Урок 2

функция get

В последней задаче, когда мы находили по букве цвет, некоторых букв не было в словаре. Тогда цвет был серый ('gray').

Для этого можно написать функцию get_color(let)

def get_color(color_dict, letter_key):
    if letter_key in color_dict:
        return color_dict[letter_key]
    else:
        return 'gray'

d = {'a': 'blue', 'z': 'red'}
col = get_color(d, 'z')     # red
col = get_color(d, 'www')   # gray, в словаре d нет ключа 'www'

В python уже есть такая функция dict.get(key, default_value=None).

col = d.get('z', 'gray')    # red, есть ключ z
col = d.get('www', 'gray')  # gray, нет ключа www, значение по умолчанию gray
col = d.get('z')            # red, есть ключ z
col = d.get('www')          # None, нет ключа www, значение по умолчанию None

Сложные значения

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

Пусть квадрат задан x, y координатами левой верхней точки и size - длиной стороны. Сохраним квадрат с координатами -100, 50 и длиной стороны 200.

Квадрат можно описать как список:

kv1 =  [-100, 50, 200]
x = kv1[0]
y = kv1[1]
size = kv1[2]

Можно забыть что в списке сначала - х координата или size. Чтобы не ошибаться, можно хранить квадрат как словарь. Ключи - строки, названия ЧТО именно хранится.

kv2 = {'x': -100, 'y': 50, 'size': 200}
x = kv2['x']   # x - это переменная, 'x' - строка (ключ)

Так с фруктами можно хранить для каждого фрукта цену и сколько килограмм этого фрукта мы купили:

fruit = {
    'apple': [50, 2.5],
    'orange': [80, 1.6],
    'banana': [60, 2.1]
}

price = fruit['apple'][0]             # какая цена яблок?
kg    = fruit['apple'][1]             # сколько яблок купили?

price, kr = fruit['apple']            # сразу присвоили цену и килограммы 

Задание: напишите программу:

Можно хранить цену и вес в словаре, для яблок это {'price': 50, 'kg': 2.5}:

fruit = {
    'apple': {'price': 50, 'kg': 2.5},
    'orange': {'price': 80, 'kg': 1.6},
    'banana': {'price': 60, 'kg': 2.1}
}

price = fruit['apple']['price']             # какая цена яблок?
kg    = fruit['apple']['kg']                # сколько яблок купили?

appl = fruit['apple']                       # в переменной appl словарь, в нем описана цена и вес яблок
print(appl)                                 # {'price': 50, 'kg': 2.5}
pr = appl['price']
kg = appl['kg']

Задание: напишите программу:

цикл по словарю

Пусть есть простой словарь, где ключи - название фруктов (строки), значение - их цена.

fruit = {
    'apple': 50,
    'banana': 60,
    'orange': 60,
    'grape': 100,
    'mango': 80
}

Перебираем ключи:

for k in fruit:
    print(k, fruit[k])

Получим

apple 50
banana 60
orange 60
grape 100
mango 80

Порядок перебора элементов в словаре в старых версиях питона может быть любой (не такой, как в примере).

Можно сразу брать ключ и значение функцией items() (так будет работать быстрее):

for k, v in fruit.items():
    print(k, v)

Можно перебирать только значения с помощью функции values():

for price in fruit.values():
    print(price)

Получим

50
60
60
100
80

Задача 2.1 Последний квадрат каждого цвета

Даны цветные квадраты по формату x y size color:

6
0 0 100 blue
100 200 200 green
-50 -100 50 red
200 0 100 red
-350 200 300 yellow
-350 -100 50 blue

Рисуем все квадраты линией, не закрашиваем.

Закрашиваем только один последний квадрат каждого цвета.

Подсказка:

kv_col_last.png

Еще подсказка:

def sq(x, y, size, filling):
    t.pu()
    t.goto(x, y)
    t.pd()
    if filling:
        t.begin_fill()
    for i in range(4):
        t.fd(size)
        t.rt(90)
    if filling:
        t.end_fill()

sq(0, 0, 100, False)   # рисует квадрат ЛИНИЯМИ
sq(0, 0, 100, True)    # рисует квадрат ЗАКРАШЕННЫЙ

Задача 2.2 Первый квадрат каждого цвета

Так же заданы квадраты.

Рисуем все квадраты линией, не закрашиваем.

Закрашиваем только один первый квадрат каждого цвета.

Подсказка:

kv_col_first.png

Задача 2.3 Менять цвета сложно

Даны квадраты, как в предыдущей задаче. Нужно нарисовать ВСЕ квадраты. Но менять цвет как можно реже.

Для этого нарисуем сначала все квадраты одного цвета, потом все квадраты другого цвета и так далее. Заведите такой словарь:

kv_all = {
    'blue': [                      # начался список квадратов синего цвета
               [0, 0, 100],
               [-100, -50, 150]
            ],
    'red': [                       # начался список квадратов красного цвета
               [100, 150, 70]
           ]
}

или такой:

kv_all = {
    'blue': [                      # начался список квадратов синего цвета
               {'x': 0, 'y': 0, 'size': 100},
               {'x': -100, 'y': -50, 'size': 150}
            ],
    'red': [                       # начался список квадратов красного цвета
               {'x': 100, 'y': 150, 'size': 70}
           ]
}

Урок 3. Словари как счетчики

Словари помогут посчитать сколько было элементов.

Методические замечания

-- TatyanaDerbysheva - 12 Mar 2019

Attachment sort Action Size Date Who Comment
kv_dict1.png manage 1.9 K 12 Mar 2019 - 13:58 TatyanaDerbysheva  
dict2.png manage 1.9 K 12 Mar 2019 - 14:10 TatyanaDerbysheva  
kv_dict3.png manage 1.9 K 12 Mar 2019 - 14:17 TatyanaDerbysheva  
kv_col_last.png manage 1.8 K 18 Mar 2019 - 09:40 TatyanaDerbysheva  
kv_col_first.png manage 1.8 K 18 Mar 2019 - 09:37 TatyanaDerbysheva