1.9 Zastosowanie pętli FOR w zadaniach

Zadania

Zadanie 1. Mając daną listę różnych liczb oraz liczbę k, zwróć informację, czy w tej liście dowolne dwa elementy z tej listy będą się sumowały do wartości k.
Na przykład dla listy [2,3,5,7,11,13,17] i k = 12 program powinien zwrócić na ekran wartość True, ponieważ 7 + 5 = 12.

Zadanie 2. Mając daną listę dodatnich liczb całkowitych, zwróć nową listę, która będzie zawierała jako i-ty element, iloczyn wszystkich elementów listy wyjściowej oprócz i-tego elementu.
Przykładowo: Jeśli wejściowa lista to [2,4,5], to listą wyjściową będzie [20,10,8].

Zadanie 3. Napisz skrypt, który z listy zadeklarowanej listy z liczbami całkowitymi wypisze wszystkie elementy większe niż 2.

Zadanie 4. Stwórz program, który na podstawie zmiennej d (dnia urodzin) i m (miesiąca urodzin) zwróci informację o znaku zodiaku.

Rozwiązania

Zadanie 1. Rozwiązanie tego problemu można zrobić na dwa sposoby. Jeden sposób to metoda siłowa, za pomocą dwóch pętli for, wzajemnie w sobie zagnieżdżonych. Może ono wyglądać np. tak:

1
2
3
4
5
6
7
8
9
10
lista = [2,3,5,7,11,13,17]
res = False

for i in lista:
    for j in lista:
        if i + j == 12 and i != j:
            res = True
            break

print(res)

Jest to rozwiązanie dobre, ale nie optymalne, ponieważ w sytuacji pesymistycznej, dla listy, która miałaby 100 elementów, przejść mielibyśmy 10 000, dla 1000 elementów – 1000000 przejść. Można też napisać ogólnie, że dla listy mającej n-elementów przejść byłoby n2.

Drugi sposób rozwiązania jest bardziej elegancki i bardziej przypomina to, w jaki sposób człowiek odpowiada na pytanie postawione w zadaniu. Patrząc na listę, na element 2 i chcąc dostać sumę dwóch elementów równą 12, wystarczy stwierdzić, czy w tej liście jest też element 10, czyli 12 - 2. Tak też napiszemy drugi skrypt:

1
2
3
4
5
6
7
8
9
lista = [2,3,4,5,6,7]
res = False

for i in lista:
    if 12 - i in lista and i != 12 - i:
        res = True
        break

print(res)

Ten algorytm dla listy n-elementowej będzie wykonywał tylko n-przejść. Oszczędność czasu będzie więc bardzo duża, dla dużych zestawów danych.

Zadanie 2. Do rozwiązania tego problemu podejdziemy sprytnie, ponieważ iloczyn wszystkich elementów z wyłączeniem danego można obliczyć tak, jak jest to pokazane poniżej. Ustalmy tylko, że pracujemy na liście x = [4,6,2].

  • obliczamy iloczyn wszystkich elementów: 4 * 6 * 2 = 48,
  • iloczyn elementów z wyjątkiem pierwszego będzie równy 48 / 4 = 12,
  • iloczyn elementów z wyjątkiem drugiego będzie równy 48 / 6 = 8,
  • iloczyn elementów z wyjątkiem trzeciego będzie równy 48 / 2 = 24.

Wynikiem działania algorytmu powinna być lista [12, 8, 24].

Przykładowy algorytm zapisany w Pythonie może wyglądać tak:

1
2
3
4
5
6
7
8
9
10
11
12
x = [4, 6, 2]
res = []
iloczyn = 1

#Iloczyn wszystkich elementów listy
for i in x:
    iloczyn *= i
#Nowa lista z iloczynami
for i in x:
    res.append(iloczyn / i)

print(res)

Zadanie 3. To zadanie jest prostym problemem na przeszukiwanie listy i wykonywanie danego działania w zależności od spełnionych warunków. Wykorzystamy tu jedną pętlę for i jedną instrukcję if. Użyjemy do tego ustalonej listy x = [2,7,2,1,4,6,7].

1
2
3
4
x = [2,7,2,1,4,6,7]

for i in x:
    if i > 2: print(i)