Lesson 04: Data Structures (Duomenų struktūros) (Part 2) [LTU] - CodeAcademy-Online/python-level-1 GitHub Wiki

Žodynas (dictionary)

❗ Kurso metu bus naudojamas EN atitikmuo: dictionary arba dict.

Tai labai pravarti duomenų struktūra, kuri bus dažnai naudojama kodo struktūrizavimo procese. Dictionary yra sudaromas iš rakto (key) ir vertės (value) porų (pairs): {key: value}.

Dictionaries yra:

  1. mutable ✔️ (gali būti keičiami)
  2. dynamic ✔️ (gali didėti ir mažėti)
  3. nested ✔️ (gali apimti kitus žodynus arba kitas sudėtingesnes struktūras)

Dictionary - tai duomenų rinkinys, kuris yra rūšiuotas (ordered),gali būti keičiamas (changeable), bet neleidžia dubliuotis rakto (keys) reikšmėm. Dictionary reikšmės pasiekiamos pagal jų keys.

Dictionary sukūrimas:

my_dictionary = {}
my_dictionary["name"] = "Tom"
print(my_dictionary["name"]])
my_dictionary = {"name": "Tom"}
print(my_dictionary["name"]])

Prieiga prie dictionary values

my_dictionary = {"name": "Tom", "pavardė": "Tom", "Tom", "Edison"}
print(f"vardas: {my_dictionary['name']}")
print(f"surname: {my_dictionary['surname']}")

Jei reikšmė neegzistuoja, gausime KeyError, nes toks key neegzistuoja:

my_dictionary = {"name": "Tom", "surname": "Edison"}
print(f"favourite car: {my_dictionary['car']}")
# KeyError: 'car'

Dictionary keys gali būti bet koks nekintamas (immutable) duomenų tipas/struktūra (taigi, negalėsite panaudoti list or dict) , bet tai negalioja values.

Keičiam values

my_dictionary = {"name": "Tom", "surname": "Edison"}
my_dictionary["name"] = "Charles"
print(f"name: {my_dictionary["name"]}")

key value pašalinimas

my_dictionary = {"name": "Tom", "surname": "Edison"}
del my_dictionary ["name"]
print(my_dictionary)

Sudėtingesnės (nested) struktūros

Matėme, kad list gali talpinti kitus list savyje kaip list elementus. Taip ir dictionary gali talpinti kitą dict kaip value, todėl galime sudaryti tokias sudėtingas hierarchijas:

user_info = {
	"name": "Albert",
	"pavardė": "Einstein",
	"profesija": {
		"vaidmuo": "profesorius",
		"darbo vieta": "profesorius": "Berlyno universitetas".
	},
        "languages": "kalbos": "vokiečių", "lotynų", "italų", "anglų", "prancūzų"]: ["vokiečių", "lotynų", "italų", "anglų", "prancūzų"]
}

Tarkime, jei norėtume spausdinti visas kalbas (value =languages) vieną po kitos, galėtume padaryti taip:

user_info = {
	"name": "Albert",
	"surname": "Einstein",
	"occupation": {
		"role": "Professor",
		"workplace": "University of Berlin"
	},
        "languages": ["German", "Latin", "Italian", "English", "French"]
}

for language in user_info["languages"]:
    print(language)

Galimybės čia neribotos, galime eiti vis giliau ir giliau.

.items()

Jei norime iteruoti per dictionary, naudosime integruotą .items() metodą:

d = {'a': 10, 'b': 20, 'c': 30}
print(list(d.items()))

.keys()

Šitas metodas grąžina visus dict keys:

d = {'a': 10, 'b': 20, 'c': 30}
list(d.keys())

.values()

Šitas metodas grąžina visus dict values:

d = {'a': 10, 'b': 20, 'c': 30}
list(d.values())

.pop

Šitas metodas išmeta key value porą, bet gražina tos poros value:

d = {'a': 10, 'b': 20, 'c': 30}
result = d.pop('a')
print(result)
print(d)

.update(obj)

Tarkim obj yra dict ir mes turėdami kitą dict (pavyzdžiui: my_dict) juos abu galime sujungti: my_dict.update(obj). Jei key, kuris ateina iš obj neegzistuoja mano my_dict, tai jis yra pridedamas iš jo (kaip key value pora), o jei egzistuoja - tada my_dict value pakeičiamas su value kurį gavome:

dict_one = {'a': 10, 'b': 20, 'c': 30}
dict_two = {'b': 200, 'd': 400}
dict_one .update(dict_two )
print(dict_one )
dict_one = {'a': 10, 'b': 20, 'c': 30}
dict_one .update([('b', 200), ('d', 400)])
print(dict_one )
dict_one = {'a': 10, 'b': 20, 'c': 30}
dict_one .update(b=200, d=400)
print(dict_one )

Iteravimas per dict

Pavyzdys:

d = {'a': 10, 'b': 20, 'c': 30}
for key, value in d.items():
    print(key, value)

Dviejų list konvertavimas į dict

Atkreipkite dėmesį, kad abu list turi būti vienodo ilgumo:

test_keys = ["Albert", "Tom", "Stephen"]
test_values = [1, 4, 5]
my_dictionary= dict(zip(test_keys, test_values))
print(my_dictionary)

Aibės (Set)

Set dažnai naudojami keliems elementams saugoti viename kintamajame. Set - tai kolekcija, kuri yra nerūšiuota, nekeičiama ir neindeksuojama.

Pastaba: sets elementai yra nekeičiami, tačiau galite juos pašalinti arba pridėti naujus elementus.

my_set = {1, 2, 3}

Dar viena svarbi savybė - rinkiniuose negalime laikyti dublikatų:

my_set = {1, 2, 3, 1}
print(my_set)
# {1, 2, 3}

Tą galim panaudoti, tarkim unikalių reikšmių gavimui iš python list:

numbers_list = [1, 2, 3, 4, 5, 5, 5, 5, 6]
numbers_set = set(numbers_list)
print(numbers_set)
# {1, 2, 3, 4, 5, 6}

🧠Užduotys

  1. Parašykite python programą, kuri paprašytų vartotojo įvesti vardą, pavardę, amžių. Įrašykite šias reikšmes į dict duomenų struktūrą ir ją išspausdinkite.

  2. Pabandykite sukurti dict struktūrą, kurioje turite panaudoti visas jums žinomas duomenų struktūras ir tipus.

  3. Sukurkite programą, kuri iš sakinių, kuriuos jus įvedėt, sukurtų dict, kuriame keys reikštų raides, o values šių raidžių dažnumą tuose sakiniuose. Programa turi reikalauti, kad vartotojas įvestų ne mažiau kaip 3 sakinius.

  4. Sukurkite studentų vardų ir jų pažymėjimų žodyną:

    • Studentų vardus saugokite kaip raktus, o jų pažymėjimus - kaip reikšmes žodyne.

    Apskaičiuokite visų studentų vidutinį pažymėjimą:

    • Naudokite sum() ir len() funkcijas apskaičiuoti bendrą ir pažymėjimų skaičių, atitinkamai, o tada bendrąjį skaičių padalinkite iš skaičiaus, kad gautumėte vidurkį.

    Pašalinti studentus, kuriems pažymėjimai mažesni nei 80, iš žodyno:

    Naudokite set, kad sukurtumėte studentų vardų rinkinį, kurių pažymėjimai yra mažesni nei 80.

    Pažiūrėti, ar konkretus studentas egzistuoja žodyne:

    • Įveskite studento vardą iš vartotojo.
    • Naudokite in operatorių, norėdami patikrinti, ar studento vardas egzistuoja žodyne.
    • Spausdinkite pranešimą, rodantį, ar studento vardas yra rastas, ar ne.

🌐 Papildomas skaitymas: