Data Analysis - Programming - 1

Week 7

Onderwerpen week 7:

Deze week weinig nieuwe stof, maar vooral veel oefeningen. Je hoeft ze niet allemaal deze week af te krijgen, bewaar er eventueel een paar om straks te oefenen voor een toets.

  • nested loops
  • nested lists

Nested loops (1)

  • hierarchische structuren kom je veel tegen tijdens het programmeren,
    zowel in de code als in de gebruikte data. Het is vaak een goede manier
    om de wereld te modelleren.
  • je bent terloops al verschillende hierarchische structuren tegen gekomen,
    zoals geneste if-statements:
px, py = 12, -4
# determine quadrant for coordinate (px, py)
if py >= 0:
    if px >= 0:
        quadrant = 1
    else:
        quadrant = 2
else:
    if px < 0 :
        quadrant = 3
    else:
        quadrant = 4

Nested loops (2)

  • for- en while-loops kunnen ook genest worden,
    bijvoorbeeld om alle mogelijke combinaties van twee variabelen met
    verschillende mogelijke waarden te maken:
counter = [0] * 11
for d1 in range(1, 7):
    for d2 in range(1, 7):
        print(d1, d2)
        counter[d1 + d2 - 2] += 1
for i in range(len(counter)):
    print("{:2} {:2}".format(i+2, counter[i]))
print("Tot {:3}".format(sum(counter)))

Opgave 1

Schrijf een programma om een antwoord op de volgende vraag te vinden.

Wat is bij het gooien met drie zeszijdige dobbelen de kans op het gooien van een totaal groter dan 12?

Nested loops (3)

  • bij het werken met nested loops zul je wel op moeten letten dat
    het aantal combinaties, en daarmee de hoeveelheid werk voor de computer,
    al snel groot wordt:
for x in range(100):
    for y in range(100):
        for z in range(100):
            fxyz = x**2 - 2*y**2 + 0.5*z**0.5

Nested lists (1)

  • ook bij datastructuren kom je hierarchische organisatie vaak tegen,
    bijvoorbeeld om een matrix te modelleren:
identity = []
size = 5
for irow in range(size):
    row = []
    for icol in range(size):
        if irow == icol:
            row.append(1)
        else:
            row.append(0)
    identity.append(row)
print(identity)
print(identity[0][0], identity[0][1])

Nested lists (2)

  • lists in Python hebben wel een eigenaardigheid waar je vooral bij
    nested lists snel tegenaan loopt:
filled = [[]] * 5
for i in range(5):
    for j in range(5):
        filled[j].append(i + 5 * j)
print(filled)
# expected structure:
# [[ 0,  1,  2,  3,  4],
#  [ 5,  6,  7,  8,  9],
#  [10, 11, 12, 13, 14],
#  [15, 16, 17, 18, 19],
#  [20, 21, 22, 23, 24]]
  • wat gaat er mis?
  • de 5 nested lists in de list filled zijn allemaal precies dezelfde list!
  • een oplossing:
filled = []
for i in range(5):
    filled.append([])

In [18]:
filled = [[]] * 5
for i in range(5):
    for j in range(5):
        filled[j].append(5 * j + i)
print(filled)
# expected structure:
# [[ 0,  1,  2,  3,  4],
#  [ 5,  6,  7,  8,  9],
#  [10, 11, 12, 13, 14],
#  [15, 16, 17, 18, 19],
#  [20, 21, 22, 23, 24]]


[[0, 5, 10, 15, 20, 1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 13, 18, 23, 4, 9, 14, 19, 24], [0, 5, 10, 15, 20, 1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 13, 18, 23, 4, 9, 14, 19, 24], [0, 5, 10, 15, 20, 1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 13, 18, 23, 4, 9, 14, 19, 24], [0, 5, 10, 15, 20, 1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 13, 18, 23, 4, 9, 14, 19, 24], [0, 5, 10, 15, 20, 1, 6, 11, 16, 21, 2, 7, 12, 17, 22, 3, 8, 13, 18, 23, 4, 9, 14, 19, 24]]