########
# 
# busca_dni
#

#
# Solució 1
#   Cerca sobre la llista.
#
def busca_dni_1(llista, dni):
    trobat = False
    for elem in llista:
        d = elem[0]
        trobat = d == dni
        if trobat:
            break
    return trobat

#
# Solució 2
#   Seleccionar els dnis de la llista i operador in
#
def busca_dni_2(llista, dni):
    llista_dnis = selecciona_dnis(llista)
    return dni in llista_dnis

def selecciona_dnis(llista):
    llista_dnis = []
    for elem in llista:
        llista_dnis.append(elem[0])
    return llista_dnis

#
# Tria la solució que vols provar
#
# busca_dni = busca_dni_1
busca_dni = busca_dni_2


########
#
# busca_nota
#

#
# Solució 1
#   Cerca sobre la llista.
#
def busca_nota_1(llista, nota):
    trobat = False
    for elem in llista:
        n = elem[1]
        trobat = n == nota
        if trobat:
            break
    return trobat

#
# Solució 2
#   Seleccionar les notes de la llista i operador in
#
def busca_nota_2(llista, nota):
    llista_notes = selecciona_notes(llista)
    return nota in llista_notes

def selecciona_notes(llista):
    llista_notes = []
    for elem in llista:
        llista_notes.append(elem[1])
    return llista_notes

#
# Tria la solució que vols provar
#
# busca_nota = busca_nota_1
busca_nota = busca_nota_2


########
#
# perc_aprovats
#

#
# Solució 1
#   Recorregut de la llista.
#
def perc_aprovats_1(llista):
    aprovats = 0
    for elem in llista:
        nota = elem[1]
        if nota >= 5:
            aprovats += 1
    pa = aprovats / len(llista)
    return pa

#
# Solució 2
#   Seleccionar les notes de la llista i filtrar les més grans que 5
#
def perc_aprovats_2(llista):
    llista_notes = selecciona_notes(llista)
    llista_aprovats = filtra_notes_mg_5(llista_notes)
    pa = len(llista_aprovats) / len(llista)
    return pa

def filtra_notes_mg_5(llista):
    llista_notes = []
    for nota in llista:
        if nota >= 5:
            llista_notes.append(nota)
    return llista_notes

#
# Tria la solució que vols provar
#
# perc_aprovats = perc_aprovats_1
perc_aprovats = perc_aprovats_2


########
#
# millor_pitjor_nota
#

#
# Solució 1
#   Recorregut de la llista.
#
def millor_pitjor_nota_1(llista):
    millor = 0
    pitjor = 10
    for elem in llista:
        nota = elem[1]
        if nota > millor:
            millor = nota
        if nota < pitjor:
            pitjor = nota
    return millor, pitjor

#
# Solució 2
#   Seleccionar les notes de la llista i calcular el màxim i el mínim
#
def millor_pitjor_nota_2(llista):
    llista_notes = selecciona_notes(llista)
    millor = max(llista_notes)
    pitjor = min(llista_notes)
    return millor, pitjor

#
# Tria la solució que vols provar
#
# millor_pitjor_nota = millor_pitjor_nota_1
millor_pitjor_nota = millor_pitjor_nota_2


########
#
# distribucio_notes
#

def distribucio_notes(llista):
    distrib = [0] * 11
    for elem in llista:
        nota_entera = int(elem[1])
        distrib[nota_entera] += 1
    return distrib


########
#
# dnis_10
#

def dnis_10(llista):
    llista_10 = []
    for elem in llista:
        dni, nota = elem
        if nota == 10:
            llista_10.append(dni)
    llista_10.sort()
    return llista_10


########
#
# ordena_dnis
#

#
# Solució 1
#   Aprofita que la relació d'ordre en llistes és l'ordre lexicogràfic
#

def ordena_dnis_1(llista):
    llista_ord = sorted(llista)
    return llista_ord

#
# Solució 2
#   Sorted admet una funció que defineix el criteri d'ordenació
#

def ordena_dnis_2(llista):
    llista_ord = sorted(llista, key=dni)
    return llista_ord

def dni(dni_nota):
    return dni_nota[0]

#
# Tria la solució que vols provar
#
ordena_dnis = ordena_dnis_1
#ordena_dnis = ordena_dnis_2


########
#
# ordena_notes
#


def ordena_notes_1(llista):
    # fem una còpia per no modificar la llista original
    # amb sort i retornar una nova
    lresultat = llista[:] 
    lresultat.sort(key = lambda x: x[1])
    return lresultat

def nota(dni_nota):
    return dni_nota[1]

def ordena_notes_2(llista):
    llista_ord = sorted(llista, key=nota)
    return llista_ord

#
# Tria la solució que vols provar
#
ordena_notes = ordena_notes_1
#ordena_notes = ordena_notes_2
