Решаване на задачи, част втора. Подход и алгоритми.

Refresher за речниците.

  1. Какво е речник?

  2. Каква е разликата между речник и списък?

  3. Синоним на думичката index?

  4. Какъв е типът на ключа на един речник?

  5. С in проверяваме какво за речниците?

  6. Как обхождаме речник?

conf = {
    "database": {
        "username": "RadoRado",
        "password": "password123",
        "host": "localhost",
        "database_name": "students"
    },
    "email": {
        "SMTP": "giga.superhosting.bg",
        "port": 223,
    },
    "users": ["Ivo", "Maria", "Rado"]
}

Имаме:

>>> conf["database"]
{'username': 'RadoRado', 'host': 'localhost'...
>>> conf["database"]["username"]
'RadoRado'
>>> conf["email"]["SMTP"]
'giga.superhosting.bg'
>>> conf["users"][0]
'Ivo'

Задачи, които сме решавали досега:

Правим директно проверка или директно сметка.

  1. Питагоров триъгълник

  2. Лице на триъгълник

  3. Четно число

from math import sqrt


def area(a, b, c):
    p = (a + b + c) / 2
    pa = p - a
    pb = p - b
    pc = p - c
    
    return sqrt(p * pa * pb * pc)

Обикновено, ако имаме формула, просто я привеждаме във вид на код и сме готови.

Задачи, които сме решавали досега:

Обхождаме списък и питаме нещо за елементите му.

  1. Дали има даден елемент?

  2. Да преброим нещо.

  3. Да намерим някакъв максимален елемент.

Елемент в списък

def member(x, xs):
    found = False
    
    for memb in xs:
        if x == memb:
            found = True
            break

    return found

Просто число в списък

def prime_in_list(numbers):
    found = False
    
    for number in numbers:
        if is_prime(number):
            found = True
            break

    return found

Брой прости числа в списък

def prime_in_list(numbers):
    count = 0
    
    for number in numbers:
        if is_prime(number):
            count += 1

    return count

Най-голям елемент в списък

def max(items):
    current_max = items[0]
    
    for item in items:
        if item > current_max:
            current_max = item
    
    return current_max

Задачи, които сме решавали досега:

Питаме нещо за съседни елементи или за два списъка.

  1. Тогава ползваме индекси.

  2. Най-често обхождаме два списъка - един с for и един с index, защото ни е дадено, че са с равна дължина и съответстващи елементи.

hash_them

def hash_them(keys, values):
    result = {}
    
    index = 0

    for key in keys:
        if index < len(values):
            result[key] = values[index]
        else:
            result[key] = None

        index += 1

    
    return result

Има ли две съседни числа в списък, такива че сумата им да е 0?

[0, 0, 1, 2, -2, 5]
[1, 2, 3, 4, 5, 6, 7, 8]
  1. За всяко число в списъка n

  2. И неговият съсед, с индекс + 1, m

  3. Ако n + m == 0, return True

  4. Ако сме завъртели целия списък, return False.

Алгоритъм за решаване:

Алгоритъм за решаване:

def zero_neighbours(numbers):
    index = 0

    for number in numbers:
        if index < len(numbers) - 1:
            neighbour = numbers[index + 1]

            if number + neighbour == 0:
                return True
        index += 1

    return False

Има ли поне една двойка числа в списъка, такива че тяхната сума да е 0?

[1, 2, 3, -1, 5, 10, -10, 20]

Кои са всички двойки в списък с 1, 2, 3?

  • 1, 1
  • 1, 2
  • 1, 3
  • 2, 1
  • 2, 2
  • 2, 3
  • 3, 1
  • 3, 2
  • 3, 3
  • 1, 1

  • 1, 2

  • 1, 3

  • 2, 1

  • 2, 2

  • 2, 3

  • 3, 1

  • 3, 2

  • 3, 3

  • 1, 1

  • 1, 2

  • 1, 3

  • 2, 2

  • 2, 3

  • 3, 3

Без повторенията:

Всички двойки се постига с 2 вложени for цикъла.

example = [1, 2, 3]

for x in example:
    for y in example:
        print(x, y)

Всички двойки без повторения - трябват ни индекси.

example = [1, 2, 3]

n = len(example)

for i in range(0, n):
    for j in range(i, n):
        x = example[i]
        y = example[j]
        print(x, y)

Без повторения, без един и същ елемент в двойка.

example = [1, 2, 3]

n = len(example)

for i in range(0, n):
    for j in range(i + 1, n):
        x = example[i]
        y = example[j]
        print(x, y)

Решение на задачата с всички двойки, чиято сума е равна на 0.

def zero_pairs(numbers):
    for x in numbers:
        for y in numbers:
            if x + y == 0:
                return True

    return False

Имаме следната задача:

Имаме два списъка от някакви елементи.
Как може да комбинираме всеки елемент от първия списък с всеки елемент от втория списък?

["Ivan", "Maria"], ["Python", "Django"]
  1. Иван, Python

  2. Иван, Django

  3. Мария, Python

  4. Мария, Django

Търсим следния резултат:

["Ivan", "Maria"], ["Python", "Django"]
items1 = ["Ivan", "Maria"]
items2 = ["Python", "Django"]

for x in items1:
    for y in items2:
        print(x, y)

Вложен for по два списъка:

Матрици

Матрицата е математическа структура, която:

  1. Се състои от редове и колони.

  2. Квадратна матрица е, при редове == колони.

  3. Бележим броя на редовете с n, а броя на колоните с m.

  4. Представяме матрицата като списък от списъци в програмирането.

  5. Един елемент на списъка == 1 ред.

[ [1, 2, 3],
  [4, 5, 6],
  [7, 8, 9] ]
[ [1, 2],
  [4, 5],
  [6, 7],
  [8, 9] ]
[ [1, 2, 3, 4] ]

Примерни матрици:

Двойно индексиране:

matr = [ [1, 2, 3],
         [4, 5, 6],
         [7, 8, 9] ]
print(matr[0][0]) # 1
print(matr[0][1]) # 2
print(matr[1][2]) # 6

Обхождането става чрез вложени for-ове

matr = [ [1, 2, 3],
         [4, 5, 6],
         [7, 8, 9] ]

for row in matr:
    for element in row:
        print(element)

Обхождането става чрез вложени for-ове

matr = [ [1, 2, 3],
         [4, 5, 6],
         [7, 8, 9] ]

n = len(matr)
m = len(matr[0])


for row_index in range(0, n)
    for col_index in range(0, m):
        element = matr[row_index][col_index]
        print(element)
Made with Slides.com