Lær Kidsa Koding

Hvordan plukke fra en num

oppgaver
#1

Hvordan plukke fra en nummerert liste?
Ved hjelp av et dataprogram har jeg nå fylt opp ei liste med 500 elementer.
Av disse har jeg nå notert på et papiret omtrent femti tall som jeg ønsker å bruke
videre. De ca 450 andre elementene trenger jeg ikke lenger.
Hva er den greieste måten å få laget den reduserte lista med de femti elementene på?

#2

det kommer litt an på. de elementene du ønsker å bruke videre, har de en spesiell struktur? for da kan du gå gjennom den store lista en gang og lage en test som sjekker etter de gitte elementene og legger de til i en annen liste istedenfor. så for å gi deg god hjelp her så trenger eg å vite hvordan listen ble laget i utgangspunktet og hvilke elementer du ønsker å beholde.

#3

Fint!
Dette var et “sokratisk spørsmål” som du har besvart nettopp på det nivået jeg håpet på.
Jeg hadde ofte problemer med at elevene startet med “å tenke syntaks” i slike situsjoner.

Etter mange år som pensjonist må jeg stadig ta meg selv i å gjøre samme feilen:
“Gidder ikke” tenke pseudokode fordi "problemet er for enkel"t. Jeg skriver kode i steden for å
finne et godt og beskrivende navn på en subrutine, for så å gå videre. (Alderssvekkelse eller for
lite trening?)

Er “top-down” fortsatt p moten, hvordan f elevene til å bryte ned problemet stegvis?

#4

Hei, Egil!

Se Python-kode og kommentarer under; skrevet i rekkefølgen jeg tenker. Salig blanding av norsk og engelsk.

# Starter med å lage noe inputdata. Vanskelig å forholde seg til kode uten å ha
# et konkret problem.

# Jeg tror du vil ha en liste med heltall av varierende størrelse, og så plukke
# disse ut.

# Først i programmet må vi importere biblioteker vi trenger. Biblioteket
# `random` gir funksjoner for å lage tilfeldige tall.

import random

def get_list_of_random_numbers(length, lowest, highest):
    """Generate a list of random numbers, where each number is between `lowest`
    and `highest`.
    """
    random_numbers = [] # Starting with an empty list

    for i in range(length):
        # ... do something many times. How many times? As many times as we need
        # list items.

        number = random.randint(lowest, highest) # Lag nytt tilfeldig tall
        random_numbers.append(number)

    # ... og gi listen med de tilfeldige tallene.
    return random_numbers

# Tester med fem tall fra null til ti:

print(get_list_of_random_numbers(5, 0, 10))

# Får vi nye tall neste gang?
print(get_list_of_random_numbers(5, 0, 10))
print(get_list_of_random_numbers(5, 0, 10))

# Jepp, ser ut til å funke. Så hvordan tenker jeg? Prøver å definere hva jeg
# trenger, og lager funksjoner for å løse problemet når jeg har et konkret
# problem.

# Da kan oss noe testdata som likner hva du hadde! Du snakker om en liste på
# fem hundre tall. Det er litt styr å skrive ut, så jeg runder ned til 50.

my_numbers = get_list_of_random_numbers(50, -10, 20)

# Så! Vi skulle beholde noen tall. Da er det fint å lage en funksjon som
# returnerer "behold" eller "ikke behold". Eventuelt en som svarer på
# svarer på spørsmålet "Skal denne beholdes?" med "ja" eller "nei".

def keep_number(number):
    """Should the number be kept?
    """

    # Beholder tall som er sju eller større enn 15. Fordi.
    if number == 7:
        return True
    if number > 15:
        return True
    else:
        return False

# Lager noen testtilfeller for å se hva som skjer.

test_numbers = [5,6,7,8,9,14,7,15,7,20,0]

for number in test_numbers:
    print(number, keep_number(number))

# Det ble mange ting skrevet ut. Skriver heller ut kun hva vi skal beholde:

for number in test_numbers:
    if keep_number(number):
        print(number)

# Ser ut til å gjøre hva den skal! Hvordan skal vi så "filtrere"? Bruker
# `keep_number`!

def filter_by_keep_number(numbers):
    filtered_numbers = [] # Starter med ingen ...

    for number in numbers:
        # Sjekker for elementer i den opprinnelige lista ...
        if keep_number(number):
            # ... og legger til elementene som passerer sjekken.
            filtered_numbers.append(number)

    # ... og gir tilbake elementene som passerer sjekken.
    return filtered_numbers


# Da kan vi gjøre hva vi skulle med den opprinnelige lista: `my_numbers`!

valid_numbers = filter_by_keep_number(my_numbers)
print(valid_numbers)

# Heh, det ser ut til å funke! Rett svar!






# ... Alternativt kan vi innføre noe mer avansert Python. Funksjonen `filter`
# finnes allerede, som gjør akkurat hva vi trenger.

print(filter(keep_number, [5,6,7,8,7])) # Skriver ut [7,7]
print(filter(keep_number, [13, 14, 15, 16, 17])) # Skriver ut [16, 17]

# Så vi kan forenkle funksjonen over litt:

def filter_by_keep_number_shorter(numbers):
    return filter(keep_number, numbers)

also_valid_numbers = filter_by_keep_number_shorter(my_numbers)
print(also_valid_numbers)

# "Behold elementer i lister basert på et predikat" er imidlertid noe vi gjør
# ofte, så det har Python bestemt seg for å gjøre veldig tilgjengelig.

# Et predikat er en funksjon som sier "ja" eller "nei" til om et element skal
# være med.

another_list_of_valid_numbers = [num for num in my_numbers # Gå gjennom tallene
                                 if num == 7 or num > 15] # Og behold de som passer.
print(another_list_of_valid_numbers)

# Vi har nå brukt en "list comprehension" ("listesammenføyning"?). Mer info om
# listesammenføyninger finnes i dokumentasjonen:

# https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions
#5

Takk for responser

Teodorlus svar minner meg på hvor lurt det er å lese andres koder. Ofte går en i samme sporet og gidder ikke lese manualer for å lære smartere måter.

Nytt for meg var: «for number in numbers» ,for å behandle ett og ett element i ei liste, nytt.

for number in my_numbers:
print(number) (har allerede brukt denne og sparte en linje med
trøblete kode og en unødvendig variabel.)

Jeg har til nå alltid brukt:

for i in range(0, len(my_numbers)):
number= my_numbers[i]
print(number)

Jeg testet selv med «my_numbers», og funksjonene til Teodorlu funker.

Når vi ikke er i mål, skyldes det at jeg slurvet i «kravspesifikasjonen» , der jeg skrev:
«…Av disse har jeg nå notert på et papiret omtrent femti tall som jeg ønsker å bruke
videre.»

«…femti tall…» Hvilke tall? Jeg burde gjort oppmerksom på at tallene er elementnummere.
Eks: Hvis my_list = [«hytte», «hus», «bil», «båt», «fly» ] , og jeg har notert: 0, 2, 3 , så er det
[«hytte» , «bil», «båt»] jeg er ute etter.
Ikke engang da Tjerand Sildre etterspurte mer informasjon, tok jeg dette opp. Beklager!

Tallene befinner seg nå på en papirlapp. Det kan vel være et par måter løse dette på.
Framgangsmåten kan beskrives med vanlig tekst, uten at vi tar noen bestemmelse for hvilket programmeringsspråk vi skal bruke.