Kolekcijas //
un datu analīze
Apgūsti Python datu struktūras - list, dict, set - un for ciklus. Analizē reālu aptaujas datu kopu.
6 stundas - kolekcijas un reāli dati
Saraksti (list) un to metodes
.append(), .pop(), .sort(), .reverse(), slice [1:3], negatīvie indeksi.
Vārdnīcas (dict): Atslēgas un vērtības
{"key": value}, .get(), .keys(), .values(), .items(), in pārbaude.
For cikli un iterācija caur kolekcijām
for x in list, enumerate(), zip(), list comprehension [x for x in s if cond].
Digitālais rīks: Google Forms aptauja
Google Forms aptaujas izveide, datu eksportēšana CSV formātā un importēšana Python analīzei.
Aptaujas datu analīze un integrācija
Reālu CSV datu apstrāde ar dict un Counter, statistikas aprēķini, vizuāla izvade terminālī.
Noslēguma projekts: Atmiņu kāršu spēle
Kāršu spēle ar list (kārtis), dict (pāri), set (atklātās), random.shuffle().
5. tēmas špikeris - datu struktūras
Saraksti, vārdnīcas, cikli pār kolekcijām un reālu datu apstrāde. Katrs bloks atbilst vienai stundai.
5.1 Saraksti un to metodes
materiali = ["marķieris", "pieraksti"]
len(materiali) # 2 elementu skaits
materiali.append("uzlīmes") # pievieno BEIGĀS
materiali.insert(1, "taimeris") # ievieto 1. pozīcijā, pārējos pabīda
materiali.pop(0) # izņem un ATGRIEŽ 0. elementu
materiali.sort() # sakārto alfabētiski (uz vietas)
materiali.reverse() # apgriež otrādi
"marķieris" in materiali # True vai ir sarakstā?
# Indeksi sākas ar 0
# materiali[0] pirmais
# materiali[-1] pēdējais
# materiali[len(materiali)] -> IndexError VIENMĒR
# DROŠA izņemšana
if i < len(materiali):
materiali.pop(i)
else:
print("Nav tāda elementa")
Lietotājam rādi numuru 1, 2, 3, bet kodā lieto indeksu 0, 1, 2 - atņem vienu.
5.2 Vārdnīcas
profils = {
"vards": "Anna",
"punkti": 10,
"materiali": ["marķieris"] # sarakstu var likt vārdnīcā
}
profils["punkti"] += 5 # maina
profils["limenis"] = 1 # pievieno jaunu atslēgu
profils["materiali"].append("uzlīme")
# DROŠA piekļuve
profils.get("zelts") # None - ja atslēgas nav
profils.get("zelts", 0) # 0 - ar noklusējumu
if "zelts" in profils: ... # pārbaude
# profils["zelts"] -> KeyError - programma apstājas
# Vārdnīca vārdnīcā
speletaji = {"Anna": {"punkti": 10}, "Jānis": {"punkti": 8}}
speletaji["Anna"]["punkti"] # 10
# Saraksts vai vārdnīca?
# saraksts - kārtība ir svarīga (TOP 5)
# vārdnīca - meklē pēc nosaukuma (spēlētāja profils)
Ja atslēgas nosaukums var būt kļūdains vai nāk no lietotāja - lieto .get(), nevis kvadrātiekavas.
5.3 For cikli pār kolekcijām
# Saraksts
for lieta in materiali:
print(lieta)
# Vārdnīca - TIKAI atslēgas
for atslega in statistika:
print(atslega)
# Vārdnīca - atslēga UN vērtība
for nosaukums, skaitlis in statistika.items():
print(f"{nosaukums.upper()}: {skaitlis}")
# Ar numerāciju no 1
for nr, lieta in enumerate(materiali, 1):
print(f"{nr}. {lieta}")
# Skaitīšana un filtrēšana
kopa = 0 # OBLIGĀTI pirms cikla, ne tajā!
lieli = 0
for nosaukums, skaitlis in statistika.items():
kopa += skaitlis
if skaitlis > 100:
lieli += 1
print(f"Kopā {kopa}, virs 100: {lieli}")
Ja skaitītāju definē cikla iekšpusē, tas katrā apgriezienā sākas no nulles un rezultāts vienmēr būs nepareizs.
5.4-5.5 Reāli dati: vākšana un tīrīšana
# Aptaujas dati kodā
popularakie = ["Marķieris", "Taimeris", "Pults"] # izvēles -> saraksts
ieteikumi = {"Anna": "Pievieno punktu tabulu"} # teksts -> vārdnīca
# Reāli dati vienmēr ir "netīri" - tos jāatlasa
derigas = []
for atbilde in visas_atbildes:
if atbilde.strip() == "": # izlaiž tukšās
continue
derigas.append(atbilde.strip())
print(f"No {len(visas_atbildes)} palika {len(derigas)}")
# Biežuma skaitīšana
skaits = {}
for vards in derigas:
skaits[vards] = skaits.get(vards, 0) + 1 # .get ar noklusējumu 0
# Procenti
for atbilde, n in skaits.items():
print(f"{atbilde}: {n / len(derigas) * 100:.0f}%")
skaits.get(vards, 0) + 1 ir standarta paņēmiens skaitītājam - bez tā pirmajā reizē būtu KeyError.
5.6 Noslēguma projekts: stāvoklis vārdnīcā
import random
klajs = ["A", "A", "B", "B"] # sāc ar 2x2, tikai tad palielini
random.shuffle(klajs)
spele = { # viss spēles stāvoklis vienuviet
"meginajumi": 0,
"atrasti_pari": 0,
"atvertas": []
}
while spele["atrasti_pari"] < len(klajs) // 2:
a = int(input("Pirmā kārts (1-4): ")) - 1 # numurs -> indekss
b = int(input("Otrā kārts (1-4): ")) - 1
print(klajs[a], klajs[b])
spele["meginajumi"] += 1
if klajs[a] == klajs[b]:
spele["atrasti_pari"] += 1
spele["atvertas"].extend([a, b])
print(f"Gatavs {spele['meginajumi']} mēģinājumos!")
Viena vārdnīca ar spēles stāvokli ir vieglāk saprotama nekā pieci atsevišķi mainīgie.