Jump to content
VivaPython

[Resolvido] Ordenação de listas

Recommended Posts

VivaPython

Eu tenho a seguinte função que já fiz que é esta :

def funcao(elemento):
   x = []
   for i in grafico:
    timestring = i["CrimeTime"]
    x.append(timestring)
   x= sorted(x)

 y= Counter(x).values()
   return x,y

E o que me dá é :

(['16:40:00', '16:45:00', '17:30:00', '18:30:00', '18:38:00', '20:00:00', '21:30:00', '21:30:00', '21:51:00'], [1, 1, 2, 1, 1, 1, 1, 1])

Sendo o que me deveria dar é :

(['16:40:00', '16:45:00', '17:30:00', '18:30:00', '18:30:00', '20:00:00', '21:30:00', '21:30:00', '21:51:00'], [1, 1, 1, 2 , 1,2, 1])

O objetivo é obter as horas ordenadas que dá correto ,e o numero de vezes que cada hora se repete , sendo que os valores estao bem , não estão é corretamente posicionados( poderá ter a ver com o facto de ir buscar os valores a dicionario) mas não estou a ver como obtenho os valores corretamente ordenados

Share this post


Link to post
Share on other sites
pwseo

VivaPython,

Se calhar precisamos dos dados a partir dos quais esses valores estão a ser calculados.

Share this post


Link to post
Share on other sites
djthyrax

Que Counter() é esse? O que ele devolve? Sem colocares o código todo aqui é complicado dizer-te o que está mal :)

Se o Counter() devolver um dicionario do tipo Tempo => Número de Ocorrências, podes fazer algo deste género depois do x = sorted(x):

p = Counter(x)
y = [p[q] for q in x] #como iteras a lista ordenada, vai bater tudo certo
return x,y
#ou
p = Counter(x).items() #vai bater tudo certo, mas nao garante que esteja ordenado
x = map(lambda q: q[0], p)
y = map(lambda q: q[1], p)
#ou
p = Counter(x).items() #same as above
x, y = zip(*p)

Uma maneira de fazeres a contagem e teres o que queres poderá ser algo deste género:

x = x.sorted()
y = []
ctr = 1
for idx in range(1,len(x)):
   if x[idx] == x[idx-1]: #se for igual ao anterior, temos +1 ocorrencia deste tempo
       ctr += 1
   else: #deixou de ser igual: guardar a contagem e limpar o contador
       y.append(ctr)
       ctr = 1
y.append(ctr) #guardar o contador referente à última posição


Não peças ajuda por PM! A tua dúvida vai ter menos atenção do que se for postada na secção correcta do fórum!

Share this post


Link to post
Share on other sites
pwseo

VivaPython,

Fui induzido em erro pelo exemplo que deste. Tens lá um valor 18:38:00 que na altura não me apercebi que deveria ser18:30:00. Corrigindo isso, torna-se simples, utilizando Counter.

Antes disso, no entanto, alguns reparos relativamente ao teu código:

# para que serve este argumento 'elemento'?
def funcao(elemento):
   x = []
   for i in grafico:
           timestring = i["CrimeTime"]  # esta linha é desnecessária...
           x.append(timestring)         # ...se aqui colocares directamente i["CrimeTime"] em vez de timestring
   x= sorted(x)

        # que indentação é esta?
        y= Counter(x).values()

   return x,y

Versão mais simples, assumindo que lista contém os valores horários:

# Não esquecer isto:
# from collections import Counter

(lista, [ x for _, x in sorted(Counter(lista).items()) ])

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.