›_ebskola.lv
Prog I · 5. tēma · 6 stundas - Python · list · dict · kolekcijas

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 list · dict · comprehension Atmiņu spēle
# 01 stundu plāns

6 stundas - kolekcijas un reāli dati

noslēguma projekts →
saraksts = [ [0] [1] [2] [3] + .append() .pop() .sort() .reverse() len() saraksts[-1] # pēdējais elements saraksts[1:3] # slice [1,2] // list operācijas
Python · listsaraksti

Saraksti (list) un to metodes

.append(), .pop(), .sort(), .reverse(), slice [1:3], negatīvie indeksi.

5.1 stundaatvērt ↗
atslēga (key) vērtība (value) "vārds" "Anna" "punkti" 250 "līmenis" 3 // dict: {key: value}
Python · dictvārdnīcas

Vārdnīcas (dict): Atslēgas un vērtības

{"key": value}, .get(), .keys(), .values(), .items(), in pārbaude.

5.2 stundaatvērt ↗
Anna Jānis Marta Pēteris for v in saraksts: print(v) for i, v in enumerate(s): print(i, v) # (0, "Anna")... [x*2 for x in s if x>0] ↑ list comprehension // for · enumerate
Python · foriterācija

For cikli un iterācija caur kolekcijām

for x in list, enumerate(), zip(), list comprehension [x for x in s if cond].

5.3 stundaatvērt ↗
Google Forms - Aptauja Kā novērtē stundu? Lieliski Labi Slikti Iesniegt → eksportēt CSV → analizēt ar Python // Google Forms → CSV
Google Forms · CSVdigitālie rīki

Digitālais rīks: Google Forms aptauja

Google Forms aptaujas izveide, datu eksportēšana CSV formātā un importēšana Python analīzei.

5.4 stundaatvērt ↗
Aptaujas rezultāti Lieliski 12 Labi 9 Vidēji 5 Slikti 2 Vidējais: 3.97 | Kopā: 28 atbildes // datu analīze
Python · statistikaanalīze

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ī.

5.5 stundaatvērt ↗
Atmiņu Kāršu Spēle ? 🌟 ? 🌟 ? ? ✓ Sakrīt! +10 punkti kārtis = list(...) | random.shuffle() atklātās = {} | pāri = set() $ python atminat.py
Python · kolekcijasprojekts

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.6 projektsatvērt ↗
# 02 špikeris

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.

$ python aptauja.py # dict uzskaita biežumu, list glabā atbildes # list + dict + for = pamats jebkurai datu apstrādei