Uke 6 - list

Les https://automatetheboringstuff.com/2e/chapter4/ frem til «EXCEPTIONS TO INDENTATION RULES IN PYTHON»-boksen.

Eksempler

Denne uken skal vi se på noen eksempler på lister og hva man kan gjøre med dem.

Eksempel 1

Last ned filen her: eksempel_1.py og kjør koden. Prøv å endre i listene og se hva som skjer.

a = [5, 7, 2, 9, 10]

print(a, len(a))

if 9 in a:
    print(f"9 is in the list {a = }!")

b = [5, "str", 9.3]

print("Lists can have mixed types inside:", b)

c = a + b

print(f"We can concatenate lists: {c = }")

####

d = [["A", "B"], ["C", "D"]]

# Hva er d[0][0]?
# Hva er d[1][0]?
print(d)
print(d[0])
print(d[0][1])


x, y, z = [1, 5, 7]

print(x)
print(y)
print(z)

Eksempel 2

Her er noen ulike metoder man kan bruke på lister. Du kan finne ut mer på https://docs.python.org/3/tutorial/datastructures.html

Last ned filen her: eksempel_2.py og kjør koden. Skjønner du hva som skjer? Prøv de ulike metodene selv.


# https://docs.python.org/3/tutorial/datastructures.html

a = [5, 7, 2, 9, 10]
print(f"{a = }")

# .append()

a.append(7)
print(f"We append 7: {a}")


# .insert()

a.insert(2, 6)
print(f"We insert 6 at index 2: {a}")

# .reverse()

a.reverse()
print(f"We reverse a: {a}")


# .remove() 
a.remove(7)
print(f"We remove the first occurence of 7: {a}")


# .sort()

a.sort()
print(f"We sort a: {a}")

Eksempel 3

I dette eksemplet spør vi brukeren om positive tall, og siden beregnes maksimum av tallene på to måter.

Last ned filen her: eksempel_3.py og kjør koden. Skjønner du hvordan while-løkken fungerer? Hvordan blir den avsluttet? Hva gjør den siste raden i den løkken? Om du er usikker kan du gå igjenom noen iterasjoner av løkken med papir og penn og se hva som skjer.

Skjønner du hvordan for-løkken fungerer?

# ask for several numbers
# store in list
# find maximum


nums = []
while True:
    n = input("A positive number (q to stop): ")
    if n == "q":
        break
    n = int(n)
    if n < 0:
        print("That was negative. Try again")
        continue
    nums.append(n)

print(f"You gave me {len(nums)} numbers.")
print("Your numbers are:", nums)

print("The maximum number is:", max(nums))

print("Doing max by hand...")
maxnum = 0
for num in nums:
    if num > maxnum:
        maxnum = num
print("My own max is:", maxnum)

I dette eksemplet lagrer vi tallene fra brukeren i en liste. Det er fordi vi ikke vet hvor mange tall vi kommer til å få fra brukeren. En liste i Python kan vi gjøre så lang som vi trenger. Vi må ikke vite i fortid hvor lang den skal være.

Eksempel 4

Her er noen eksempler på metodene split() og join().

Last ned filen her: eksempel_4.py og kjør koden. Hvordan fungerer split()? Hvordan fungerer join()? Hva gjør for-løkken?

text = "Alice was beginning to get very tired"
print(text)

words = text.split()
print(words)
print(len(words),'words')

weird = text.split('t')
print(weird)

joined = '==='.join(words)
print(joined)

nospaces = ''.join(words)
print(nospaces)
print()

print('Lines of 3 words each:')

line = []
for w in words:
    if len(line) < 3:
        line.append(w)
    else:
        print(' '.join(line))
        line = [w] # start next line
print(' '.join(line))

Eksempel 5

Her er et eksempel på metoden enumerate(). Med enumerate() i en for-løkke får man ikke bare elementene i listen, men man får også indeksen for elementene.

I dette eksempelet lager vi en funksjon poly_string() som gjør den samme ting som funksjonen med samme navn i oppgave 1, uke 4, men med forskjellen at funksjonen tar en liste med koeffisienter som argument, sånn at polynomet kan være av hvilken grad som helst.

Vi lager også en funksjon poly_val() som beregner verdien av et polynom i en punkt. Argumenten til funksjonen er en liste med koeffisienter og et tall.

Last ned filen her: eksempel_5.py og kjør koden. Skjønner du hva som skjer? Kan du endre koden til å ikke bruke enumerate()?

# Example of enumerate:
# printing polynomials,
# calculating values of polynomials


def poly_val(coeffs, x):
    """Calculate value of polynomial at a point

    coeffs: a list of non-negative integer coefficients of a polynomial
            sorted from lowest degree to highest degree
    x: a float, the point at which to evaluate the polynomial
    """

    sum = 0
    for i, coe in enumerate(coeffs):
        sum += coe * x ** i
    return sum


def poly_string(coeffs):
    """Give a string representation of a polynomial

    coeffs: a list of non-negative integer coefficients of a polynomial
            sorted from lowest degree to highest degree
    """
    terms = []

    if coeffs:  # Adding the constant term
        coe = coeffs[0]
        if coe != 0:
            terms.append(str(coe))
        coeffs = coeffs[1:]

    if coeffs:  # Adding the linear term
        coe = coeffs[0]
        if coe == 1:
            terms.append("x")
        elif coe > 1:
            terms.append(f"{coe}x")
        coeffs = coeffs[1:]

    if coeffs:  # Adding all other terms
        for i, coe in enumerate(coeffs):
            if coe == 1:
                terms.append(f"x^{i+2}")
            elif coe > 1:
                terms.append(f"{coe}x^{i+2}")

    if not terms:  # If we were given an empty list or only zeros
        return "0"
    else:
        terms.reverse()
        return " + ".join(terms)


# Give a list of coefficients sorted from highest to lowest degree
# (as in exercise 1, week 4).
coeffs = [6, 12, 0, 1, 5]  # 6x^4 + 12x^3 + x + 5
x = 2

coeffs.reverse()


print(f"The value of {poly_string(coeffs)} at {x = } is {poly_val(coeffs, x)}.")

Eksempel 6

Her er et eksempel på bruk av in i en for-løkke.

Last ned filen her: eksempel_6.py. Før du kjør koden, hva tror du output blir? Kjør koden. Var det riktig?

# This code should tell a visitor entering a museum what
# they must pay, depending on whether the visitor is a
# senior, a student or none of the above. Try some different values.


def ticket_price(visitor_type):
    """Calculate the ticket price based on visitor category.

    visitor_type: a list of categories
    """
    if "senior" in visitor_type:
        return 80
    elif "student" in visitor_type:
        return 90
    else:
        return 100


alice = ["student", "senior"]
bob = []
carol = ["senior"]
dan = ["student"]

visitors = [alice, bob, carol, dan]

for v in visitors:
    price = ticket_price(v)
    print(f"{v} has to pay kr.{price}.")

Kan du endre koden slik at navnene blir skrevet ut?

Eksempel 7

Her er et eksempel på ting som kan gå feil med lister.

Last ned filen her: errors_1.py. Før du kjør koden, se om du finner alle feil. Prøv å kjøre koden. Endre sånn at koden går å kjøre.

a = ["xyz", "abc", 5.4, "z", True, 7, "Hei there"]
length = len(a)
print(a[length])


b = [12, 34, 1, 107, "14", 16, 19]
b.sort()
print(b)

#####

print("Returning coins:")

coins = [1, 5, 10, 20]

price = 24
payment = 50

# work out return coins
diff = payment - price
for c in coins:
    while diff > c:
        print(f"Returning kr.{c}")
        diff -= c

Koden i slutten skal beregne de mynt som skal returneres ved en betaling. Det finnes 20-kr, 10-kr, 5-kr og 1-kr. Den skal returnere slik at man får så få mynt som mulig. For eksempel, om priset er 24 kr og betalingen er 50 kr skal den returnere én 20-kr, én 5-kr og én 1-kr. Men noe er feil med koden sånn att den ikke gjør helt hva den skal. Kan du endre sånn at den fungerer som den skal?

Oppgaver

Oppgavene denne uken er å gjøre ’practice questions’ 1-10 i kapittel 4 i Automate the Boring Stuff. Du trenger ikke å levere inn noe via git.