Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Ordenando uma lista de músicas em ordem decrescente do número de toques sem usar sort ou sorted?

musicas=[
    ('Música3',{'toques':137}),
    ('Música7',{'toques':2}),
    ('Música11',{'toques':30}),
    ('Música9',{'toques':45}),
    ('Música10',{'toques':79}),
    ('Música2',{'toques':190}),
    ('Música8',{'toques':201}),
    ('Música5',{'toques':44}),
    ('Música1',{'toques':29}),
    ('Música6',{'toques':14}),
    ('Música4',{'toques':14}),
]

Como criar uma nova lista chamada 'maistocadas' em que apareçam as músicas da lista musicas ordenadas em função do número de toques (ordem decrescente) mas sem usar sort ou sorted do Python?

Eu fiz:

   lista=[
    ('Música3',{'toques':137}),
    ('Música7',{'toques':2}),
    ('Música11',{'toques':30}),
    ('Música9',{'toques':45}),
    ('Música10',{'toques':79}),
    ('Música2',{'toques':190}),
    ('Música8',{'toques':201}),
    ('Música5',{'toques':44}),
    ('Música1',{'toques':29}),
    ('Música6',{'toques':14}),
    ('Música4',{'toques':14}),
]

temp = lista[:]
ordenados = list()
maistocadas = []
"""
procuro o maior insiro na lista ordenados e depois removo da lista
temp. em seguida procuro o novo maior e repito o processo até esvaziar
temp



while not len(temp) == 0:
    pos = 0
    while pos < len(temp):
        if pos == 0:
            maior = temp[pos]
        elif temp[pos][1]['toques'] > maior[1]['toques']:
            maior = temp[pos]       
        pos += 1

    ordenados.append(maior)
    temp.remove(maior)
print(temp)
print(ordenados)
for ele in ordenados:
    maistocadas.append(ele[0])

print(f"As músicas mais tocadas: {maistocadas} ")

O programa funciona mas deve existir uma maneria mais simples de fazer. Alguma sugestão?

6 respostas
solução!

Relativo à desempenho, quando se trata m organização de listas, o tema base para procurar estudar é o "Bubble Sort". Procure, leia, pratique e entenda como funciona. :)

Veja o algoritmo em funcionamento:

Do mais básico, usamos uma terceira variável temporária para intermediar a troca de valores entre duas variáveis, quando uma é maior/menor que a outra. Segue abaixo um exemplo que peguei num mini artigo enquanto estudava o tema:

def bubbleSort(alist):
    for passnum in range(len(alist)-1,0,-1):
        for i in range(passnum):
            if alist[i]>alist[i+1]:
                temp = alist[i]
                alist[i] = alist[i+1]
                alist[i+1] = temp

alist = [54,26,93,17,77,31,44,55,20]
bubbleSort(alist)
print(alist)

Passos: 1 - Verificar quantos itens tem na lista, esse é o número máximo de vezes que você vai precisar percorrer a lista para organizar toda a lista.

2 - Fazer um segundo loop com a mesma quantidade de vezes para iniciar a organização da lista.

3 - Comparar o valor do item atual da lista com o da frente (aqui você quem define se o critério de comparação é ser "maior" ou "menor", definindo uma organização crescente ou decrescente).

4 - Usar o sistema de variável intermediária para trocar o valor dos dois itens comparados.

Obrigado, Thiago Matos . Vou estudar!

Fique a vontade para nos mostrar o resultado :)

Uma dúvida: se eu quisesse usar o sort do Python nesta questão, como seria?

Eu mudaria a estrutura de dados, da salada de tuplas com listas e dicionários para apenas dicionários, mantendo uma chave única para pesquisa (musica) que nunca se repete, e seus valores (vezes tocadas) como valor da chave, aqui vou fazer uma coisa feia que é deixar esse valor dentro de um segundo dicionário, permitindo que você adicione mais valores posteriormente caso queira ordenar por outros critérios, como ano de lançamento, gênero musical, etc:

lista={
    'Música3':{'toques':137},
    'Música7':{'toques':2},
    'Música11':{'toques':30},
    'Música9':{'toques':45},
    'Música10':{'toques':79},
    'Música2':{'toques':190},
    'Música8':{'toques':201},
    'Música5':{'toques':44},
    'Música1':{'toques':29},
    'Música6':{'toques':14},
    'Música4':{'toques':14},
}

temp = []
chave = 'toques'
temp = sorted(lista.items(), key=lambda x: x[1][chave], reverse=False)
#--------------Cada item, Considerar item: valor['chavedovalor], ordem crescente ou decrescente
print(temp)

Obrigado. vou estudar o código!