Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

VivaPython

[Resolvido] Ordenação de listas

Mensagens Recomendadas

VivaPython    0
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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
djthyrax    10
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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pwseo    223
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()) ])

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.