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))
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgQ291bnRlcgoKZGVmIGNvbV9saXN0X2NvdW50KHZhbHMpOiAjIHVtYSBkYXMgcmVzcG9zdGFzCiAgICB1bmlxdWVzID0gW2kgZm9yIGkgaW4gdmFscyBpZiB2YWxzLmNvdW50KGkpIDwgMl0gIyBsaXN0YSBkZSB0b2RvcyBvcyB2YWxvcmVzIHVuaWNvcyBkZSB2YWxzCiAgICByZXR1cm4gbWF4KHVuaXF1ZXMpLCBtaW4odW5pcXVlcykKCmRlZiBjb21fbGlzdF9jb3VudDIobGlzdGEpOiAjIG91dHJhIHJlc3Bvc3RhCiAgICBsaXN0YVNlbVJlcGV0aWRvcyA9IFtdCiAgICBmb3IgaSBpbiByYW5nZShsZW4obGlzdGEpKToKICAgICAgICBpZiBsaXN0YS5jb3VudChsaXN0YVtpXSkgPT0gMToKICAgICAgICAgICAgbGlzdGFTZW1SZXBldGlkb3MuYXBwZW5kKGxpc3RhW2ldKQogICAgaWYgbGlzdGFTZW1SZXBldGlkb3MgPT0gW106CiAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIG1heChsaXN0YVNlbVJlcGV0aWRvcyksIG1pbihsaXN0YVNlbVJlcGV0aWRvcykKCmRlZiBjb21fY291bnRlcih2YWxzKTogIyBzb2x1w6fDo28gc3VnZXJpZGEgY29tIENvdW50ZXIgZSB1bSDDum5pY28gbG9vcCBlbSB2ZXogZGUgdXNhciBtaW4gZSBtYXgKICAgIGMgPSBDb3VudGVyKHZhbHMpCiAgICBtZW5vciwgbWFpb3IgPSBmbG9hdCgnaW5mJyksIGZsb2F0KCctaW5mJykKICAgIGZvciBuLCBxdGQgaW4gYy5pdGVtcygpOgogICAgICAgIGlmIHF0ZCA9PSAxOgogICAgICAgICAgICBpZiBuID4gbWFpb3I6CiAgICAgICAgICAgICAgICBtYWlvciA9IG4KICAgICAgICAgICAgaWYgbiA8IG1lbm9yOgogICAgICAgICAgICAgICAgbWVub3IgPSBuCiAgICByZXR1cm4gbWFpb3IsIG1lbm9yCgpmcm9tIHJhbmRvbSBpbXBvcnQgY2hvaWNlcwojIGdlcmFyIHVtYSBsaXN0YSBjb20gMTAgbWlsIG7Dum1lcm9zCiMgdXNhciBpbnRlcnZhbG8gZW50cmUgMTAgZSA5OTkgcGFyYSB0ZXIgdsOhcmlvcyBuw7ptZXJvcyByZXBldGlkb3MKdmFscyA9IGNob2ljZXMocmFuZ2UoMTAsIDEwMDApLCBrPTEwMDAwKQojIGFkaWNpb25hciBuw7ptZXJvcyDDum5pY29zIChxdWUgbsOjbyBzZSByZXBldGVtKQp2YWxzLmV4dGVuZChbOCwgMjUwMCwgMzIzMCwgNF0pCgpmcm9tIHRpbWVpdCBpbXBvcnQgdGltZWl0CgojIGV4ZWN1dGEgMSB2ZXogY2FkYSB0ZXN0ZSAoNSB2ZXplcyBlc3RvdXJvdSBvIGxpbWl0ZSBkZSB0ZW1wbykKcGFyYW1zID0geyAnbnVtYmVyJyA6IDEsICdnbG9iYWxzJzogZ2xvYmFscygpIH0KCnByaW50KHRpbWVpdCgnY29tX2xpc3RfY291bnQodmFscyknLCAqKnBhcmFtcykpCnByaW50KHRpbWVpdCgnY29tX2xpc3RfY291bnQyKHZhbHMpJywgKipwYXJhbXMpKQpwcmludCh0aW1laXQoJ2NvbV9jb3VudGVyKHZhbHMpJywgKipwYXJhbXMpKQo=