Sąrašo elementų keitimas ir atnaujimas
Gilinsimės į sąrašų manipuliavimo metodus. Mokysimės, kaip efektyviai pridėti, pašalinti ir keisti sąrašo elementus, gauti naują sąrašą transformuojant esantį.
Elemento keitimas naudojantis indeksą
Kadangi žinome, kaip pasiekti bet kurį sąrašo elementą naudojantis indeksais, nesunkiai pakeisime ir pasirinktame indekse esantį elementą. Pirmiausiai nurodysime, kurį elementą norime keisti, o tada naudojantis lygybės ženklu priskirsime naują reikšmę:
customer_names = ["Dwain", "Catarina", "Nelia", "Melita", "Tedd"]
print("Before changing:")
print(customer_names)
customer_names[1] = "Vilius"
print("After changing")
print(customer_names)
Įvykdžius šį kodą, matome tokį rezultatą konsoliniame lange:
Before changing:
['Dwain', 'Catarina', 'Nelia', 'Melita', 'Tedd']
After changing
['Dwain', 'Vilius', 'Nelia', 'Melita', 'Tedd']
Pakeitėme sąraše antrąjį elementą (indeksas 1) ir sąrašas pasikeitė. Taip galima pakeisti bet kurioje pozicijoje esantį elementą.
Reiktų atkreipti dėmesį į kraštutinį atvejį (angl. edge case), kai bandomamas pakeisti elementas su indeksu, kuris mažesnis nei sąrašo dydis. Paimkime tą patį sąrašą ir pabandykime pakeisti elementą esantį inkdekse 10:
customer_names = ["Dwain", "Catarina", "Nelia", "Melita", "Tedd"]
customer_names[10] = "George"
Įvykdę kodą pamatysite įvykusią klaidą, kuri ganėtinai aiškiai aprašo iškilusią problemą:
IndexError: list assignment index out of range
Elementų pridėjimas
Toliau pasižiūrėkime, kaip trimis metodais galime pridėti naujus elementus į sąrašą.
append()
Žodis append reiškia pridėjimą prie galo. Tokia pat šio žodžio reikšmė python kalboje. Šiuo metodu pridėsime elementą prie sąrašo galo, taip jį praplėsdami. Pavyzdžiui:
shopping_list = ["1,5 kg of apples", "chuck steak", "toilet paper", "tomato paste"]
print("Shopping list before append")
print(shopping_list)
shopping_list.append("Gouda cheese")
print("Shopping list after append:")
print(shopping_list)
Įvykdžius kodą, gauname:
Shopping list before append
['1,5 kg of apples', 'chuck steak', 'toilet paper', 'tomato paste']
Shopping list after append:
['1,5 kg of apples', 'chuck steak', 'toilet paper', 'tomato paste', 'Gouda cheese']
Tą patį galima padaryti ir su tuščiu sąrašu:
abc = []
abc.append("a")
abc.append("b")
abc.append("c")
abc.append("d")
print(abc) # prints: ['a', 'b', 'c', 'd']
Daugiau panaudojimo atvejų pamatysite toliau - pavyzdžiuose.
insert()
Su insert() metodu galima elementą įterpti į bet kurią sąrašo vietą.
elements = ["e1", "e2", "e3", "e4", "e5"]
print("List before insert:")
print(elements)
elements.insert(4, "f")
print("List after insert")
print(elements)
Šiuo atveju elementas įterpiamas į indeksą - naujai įterpto elemento indeksas yra 4, toks kokį nurodėme pirmajame argumente. Antrajame metodo argumente nurodomas elementas, kurį norime įterpti.
Sąrašų sujungimas
Sujungti sąrašą galima dviem būdais su metodu extend() ir pliuso ženklu +:
list_1 = [1, 2]
list_2 = [3, 4]
list_1.extend(list_2)
print(f"list_1.extend(list_2): {list_1}") # Modifies original list
list_a = ["a", "b"]
list_c = ["c", "d"]
print(f"list_a+list_c: {list_a+list_c}") # Does not modify original list
Rezultatas
list_1.extend(list_2): [1, 2, 3, 4]
list_a+list_c: ['a', 'b', 'c', 'd']
Atkreipkite dėmesį, kad su extend() metodu pakeičiame sąrašą, o sudedant - ne.
Elemento pašalinimas
Elemento pašalinimui iš sąrašo naudosime remove() ir pop() metodus. Vienu atveju nurodysime elemento reikšmę, kitu - indeksą.
remove()
Naudojant remove() metodą reikia nurodyti elementą, kurį norime pašalinti:
# Words from https://www.youtube.com/watch?v=PKQPey6L42M
coconut_song = ["The", "coconut", "nut", "is", "not", "a", "giant", "nut"]
print("Coconut song before remove:")
print(coconut_song)
coconut_song.remove("not")
print("Coconut song after \"not\" remove:")
print(coconut_song)
Rezultatas:
Coconut song before remove:
['The', 'coconut', 'nut', 'is', 'not', 'a', 'giant', 'nut']
Coconut song after "not" remove:
['The', 'coconut', 'nut', 'is', 'a', 'giant', 'nut']
Prieš ištrinant būtina įsitikinti, kad nurodytas elementas egzistuoja sąraše:
fruits = ["pineapple", "dragonfruit", "durian", "rambutan", "mango"]
fruits.remove("ananas")
Įvykdžius tokį kodą, kuriame trinamo elemento sąraše nėra, išmetama klaida:
ValueError: list.remove(x): x not in list
Kaip ir kaskart atsiradus klaidai, perskaitykite klaidos žinutę, iš kurios galėsite suprasti, kur padaryta klaida.
pop()
Metodą pop() naudosime, kai elementą norėsime pašalinti nurodant indeksą. Tarkime turime sąrašą su daržovėmis ir žinome, kad elementas, kurio indeksas yra 1, yra ne daržovė, todėl jį reikia pašalinti:
vegatables = ["onion", "chicken thights", "garlic", "tomato", "potato"]
print("Vegatables before pop:")
print(vegatables)
vegatables.pop(1)
print("Vegatables after popping element (index 1):")
print(vegatables)
Rezultatas:
Vegatables before pop:
['onion', 'chicken thights', 'garlic', 'tomato', 'potato']
Vegatables after popping element (index 1):
['onion', 'garlic', 'tomato', 'potato']
Užduotys
1. Skaičiai dalūs iš 7
Sukurkite sąrašą skaičių nuo a(įskaitant) iki b(įskaitant), kurie dalijasi be liekanos iš 7. Skaičius a iki b turi įvesti programos naudotojas.
2. Skaičių pašalinimas
Sukurkite programą, kuri iš sąrašo pašalintų skaičius, kurie yra mažesni negu nurodytas (įvestas iš konsolės). Nurodykite kiek skaičių buvo pašalinta iš sąrašo.
Programa turi pabaigti darbą, jeigu įvestis (tekstas) nėra skaičius arba (sudėtingiau) iš naujo paprašyti, kad vartotojas įvestų skaičių.
Programos išvesties pavyzdys:
Initial list:
[10, 25, 25.55, 200, -10, 55]
Input threshold number: 25
2 numbers were removed:
[25, 25.55, 200, 55]
3. Darbų sąrašas
Sukurkite programą, kuri pašalintų atliktą darbą (pagal eilės numerį) iš darbų sąrašo.
Pavyzdinis darbų sąrašas:
todo_list = [
"Buy groceries",
"Finish homework",
"Call mom",
"Clean the house",
"Pay electricity bill",
"Walk the dog",
"Read a book for 30 minutes",
"Prepare dinner",
"Water the plants",
"Schedule a meeting with the team"
]
Programos išvesties pavyzdys:
Your todo list:
0. Buy groceries
1. Finish homework
2. Call mom
3. Clean the house
4. Pay electricity bill
5. Walk the dog
6. Read a book for 30 minutes
7. Prepare dinner
8. Water the plants
9. Schedule a meeting with the team
Select the number of the task you have completed: 3
Updated to-do list:
0. Buy groceries
1. Finish homework
2. Call mom
3. Pay electricity bill
4. Walk the dog
5. Read a book for 30 minutes
6. Prepare dinner
7. Water the plants
8. Schedule a meeting with the team
4. Savaitės temperatūra
Sukurkite programą, kurioje apskaičiuojamas savaitės temperatūros vidurkis, įvedant vartotojui temperatūra į konsolinį langą.
Programos išvestis galėtų atrodyti taip:
Enter the temperature for day 1: 31
Enter the temperature for day 2: 28
Enter the temperature for day 3: 25
Enter the temperature for day 4: 25
Enter the temperature for day 5: 27
Enter the temperature for day 6: 22
Enter the temperature for day 7: 30
Temperatures for the week: [31.0, 28.0, 25.0, 25.0, 27.0, 22.0, 30.0]
Average temperature: 26.86
5. Žaidimas - akmuo, žirklės, popierius
Žaidimo esmė - pasirinkti vieną iš trijų ženklų ir laimėti prieš kompiuterį
Žaidimo reikalavimai:
- Žaidimas nesibaigiantis, žaidžiama, kol žaidėjas išjungia žaidimą arba pasirenką specialų simbolį (jūsų sugalvotas, pvz.: 'Q');
- Po kiekvienio raundo, parodoma statistika, kiek žaidėjas kartų laimėjo prieš kompiuterį ir kiek buvo raundų;
- Įvedus specialių simbolį (pvz.: 'H'), parodama visų raundų istorija, pvz.: "1. žirklės - popierius; 2. žirklės - akmuo; 3. popierius - akmuo...";
Taisyklės:
- Akmuo laimi prieš žirkles;
- Žirklės laimi prieš popierių;
- Popierius laimi prieš akmenį;
Vietoje rašymo viso ženklo žodžio į konsolę, žaidėjas galėtų pasirinkti skaičių nuo 1-3, kurie reprezentuotų akmenį, žirkles ir popierių. Žaidimo pradžia konsolėje galėtų atrodyti taip:
Žaidimas - akmuo, žirklės, popierius
Instrukcija:
Kiekviename raunde kompiuteris sugalvos savo ženklą, o jūs su skaičiais turite pasirinkti vieną iš trijų ženklų;
1 - akmuo
2 - žirklės
3 - Popierius
Papildomos komandos:
q - žaidimo išjungimas
h - raundų istorija
Taisyklės:
...
Pasirinkite ženklą:
...
6. Žaidimas - atspėk skaičių
Žaidimo esmė - atspėti skaičių (sveikąjį), kurį jūsų programa sugeneruoja atsitiktinai.
Žaidimo reikalavimai:
- Turi prasidėti dviejų skaičių įvedimu (konsoliniame lange), pagal kuriuos bus generuojamas skaičius;
- Spėjimas vykdomas įvedant skaičių į konsolinį langą;
- Žaidimas turi turėti bandymų skaičių, kuriuos išnaudojus žaidimas pralaimimas;
- Žaidimas laimimas atspėjus skaičių;
- Po kiekvieno spėjimo žaidimas turi pranešti, ar įvestas skaičius didesnis ar mažesnis už atsiktiktinį;
- Žaidimo gale turi būti pavaizduoti visi spėjimai.
- Papildomas: įvedus kažką kito negu skaičių, programa turi pranešti, kad įvestas tekstas nėra skaičius;
Žaidimo eiga galėtų atrodyti taip:
=========================================
Žaidimas - atspėkite skaičių
=========================================
Įveskite generavimo intervalo pirmąjį skaičių:
2
Įveskite generavimo intervalo antrajį skaičių:
143
----------------------------------------------
Pradėkite spėjimus (nuo 2 iki 143)
1 bandymas: 4
Neatspėjote skaičiaus, sugalvotas skaičius didesnis už jūsų bandymo skaičių.
2 bandymas: 143
Neatspėjote skaičiaus, sugalvotas skaičius mažesnis už jūsų bandymo skaičių.
3. bandymas: 7
Atspėjote skaičių!
Rezultatas: 3/7
Jūsų spėjimai: 4, 143, 7