Naloge

Seznam imen

Napiši funkcijo capitalize(xs), ki sprejme seznam imen in vrne nov seznam, v katerem se vsa imena začnejo z veliko začetnico. Pomagaj si z metodo nizov capitalize(). Seznam xs mora ostati po klicu funkcije nespremenjen.

>>> imena = ['marko', 'Miha', 'maja', 'Monika']
>>> capitalize(imena)
['Marko', 'Miha', 'Maja', 'Monika']
>>> imena
['marko', 'Miha', 'maja', 'Monika']

Rešitev

def capitalize(xs):
    ys = []
    for x in xs:
        ys.append(x.capitalize())
    return ys

Napiši funkcijo icapitalize(xs), ki podani seznam spremeni tako, da se vsa imena začnejo z veliko začetnico.

>>> imena = ['marko', 'Miha', 'maja', 'Monika']
>>> icapitalize(imena)
>>> imena
['Marko', 'Miha', 'Maja', 'Monika']

Rešitev

def icapitalize(xs):
    for i in range(len(xs)):
        xs[i] = xs[i].capitalize()

Zamenjave

Napiši funkcijo zamenjano(s, menjave), ki prejme seznam s in slovar menjave. Vrne naj nov seznam, v katerem so vsi elementi seznama, ki nastopajo kot ključi v slovarju, zamenjani s pripadajočimi vrednostmi. Elemente, ki se ne pojavijo v slovarju, pusti pri miru. Funkcija zamenjano ne sme spremeniti podanega seznama s.

>>> zamenjano(["Ana", "Ana", "Berta", "Ana", "Cilka"], {"Ana": "Peter", "Berta": "Ana"})
["Peter", "Peter", "Ana", "Peter", "Cilka"]

Poleg tega napiši podobno funkcijo zamenjaj(s, menjave), ki pa ne vrne ničesar temveč ustrezno spremeni podani seznam s.

>>> imena = ["Ana", "Ana", "Berta", "Ana", "Cilka"]
>>> zamenjaj(imena, {"Ana": "Peter", "Berta": "Ana"})
>>> imena
["Peter", "Peter", "Ana", "Peter", "Cilka"]

Rešitev

def zamenjano(seznam, menjave):
    return [menjave.get(e, e) for e in seznam]

def zamenjaj(seznam, menjave):
    seznam[:] = zamenjano(seznam, menjave)

Alterniraj

Napiši funkcijo alterniraj(s), ki prejme seznam števil in ga spremeni tako, da za vsakim pozitivnim številom odstrani vsa števila do naslednjega negativnega števila, in za vsakim negativnim vsa števila do naslednjega pozitivnega. Funkcija naj spremeni podani seznam in ne vrne ničesar. Z drugimi besedami, funkcija obdrži prvi element vsakega zaporedja pozitivnih ali negativnih števil.

>>> seznam = [3, 4, -1, 1, -5, -2, -1, 7, -8]
>>> alterniraj(seznam)
>>> seznam
[3, -1, 1, -5, 7, -8]

Rešitev

def alterniraj(x):
    n = []
    for e in x:
        if not n or e * n[-1] < 0:
            n.append(e)
    x[:] = n

Podvoji

Tvoja naloga je napisati dve različici funkcije, ki podvoji seznam seznamov: iz [[1,2],[3],[7,1,2]] nastane [[1,2],[3],[7,1,2],[1,2],[3],[7,1,2]]. Funkcije spreminjajo podani seznam in ne vračajo ničesar.

Funkcija dodaj_isti(s) naj podvoji seznam tako, da dodaja na konec iste elemente, funkcija dodaj_enak(s) pa enake (vendar ne iste). Glej naslednja primera:

>>> s = [[1,2],[3],[7,1,2]]
>>> dodaj_isti(s)
>>> s[0].clear()
>>> s
[[],[3],[7,1,2],[],[3],[7,1,2]]

>>> s = [[1,2],[3],[7,1,2]]
>>> dodaj_enak(s)
>>> s[0].clear()
>>> s
[[],[3],[7,1,2],[1,2],[3],[7,1,2]]

Rešitev

def dodaj_isti(s):
    for i in range(len(s)):
        s.append(s[i])

def dodaj_enak(s):
    for i in range(len(s)):
        s.append(list(s[i]))

Duplikati

Napiši funkcijo poenoti(s), ki bo spremenila podani seznam s tako, da bodo enaki elementi seznama pravzaprav isti.

>>> s = [[1,2],[3],[1,2],[1,2],[3]]
>>> poenoti(s)
>>> s[2].append(9)
>>> s
[[1, 2, 9], [3], [1, 2, 9], [1, 2, 9], [3]]

Z obratnim problemom se srečamo, če želimo na hitro ustvariti seznam seznamov, npr. s = [[]]*10. Napiši funkcijo razenoti(s), ki bo poskrbela, da v seznamu ne bo istih elementov (zamenjala jih bo z enakimi).

>>> s = [[]]*10
>>> s[0].append(1)
>>> s
[[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]]
>>> razenoti(s)
>>> s[1].append(2)
>>> s
[[1], [1, 2], [1], [1], [1], [1], [1], [1], [1], [1]]

Rešitev

def poenoti(s):
    for i in range(len(s)):
        s[i] = s[s.index(s[i])]

def razenoti(s):
    for i in range(len(s)):
        s[i] = list(s[i])

Slikaj

Napišite funkcijo slikaj, ki sprejme funkcijo f in seznam [x_1, x_2, ..., x_n] in vrne nov seznam [f(x_1), f(x_2), ..., f(x_n)].

>>> slikaj(abs, [-5, 8, -3, -1, 3])
[5, 8, 3, 1, 3]
>>> slikaj(len, "Daydream delusion limousine eyelash".split())
[8, 8, 9, 7]

Rešitev

def slikaj(f, s):
    return [f(x) for x in s]

Last modified: Friday, 4 December 2020, 12:40 PM