from collections import Counter

def com_list_count(vals): # uma das respostas
    uniques = [i for i in vals if vals.count(i) < 2] # lista de todos os valores unicos de vals
    return max(uniques), min(uniques)

def com_list_count2(lista): # outra resposta
    listaSemRepetidos = []
    for i in range(len(lista)):
        if lista.count(lista[i]) == 1:
            listaSemRepetidos.append(lista[i])
    if listaSemRepetidos == []:
        return None, None
    else:
        return max(listaSemRepetidos), min(listaSemRepetidos)

def com_counter(vals): # solução sugerida com Counter e um único loop em vez de usar min e max
    c = Counter(vals)
    menor, maior = float('inf'), float('-inf')
    for n, qtd in c.items():
        if qtd == 1:
            if n > maior:
                maior = n
            if n < menor:
                menor = n
    return maior, menor

from random import choices
# gerar uma lista com 10 mil números
# usar intervalo entre 10 e 999 para ter vários números repetidos
vals = choices(range(10, 1000), k=10000)
# adicionar números únicos (que não se repetem)
vals.extend([8, 2500, 3230, 4])

from timeit import timeit

# executa 1 vez cada teste (5 vezes estourou o limite de tempo)
params = { 'number' : 1, 'globals': globals() }

print(timeit('com_list_count(vals)', **params))
print(timeit('com_list_count2(vals)', **params))
print(timeit('com_counter(vals)', **params))
