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) |