Ordenação de Listas e Dicionários Aninhados em Python

No Python, a ordenação de coleções de dados é facilitada por dois mecanismos principais: o método sort() e a função sorted(). O método sort() altera a lista original diretamente e é otimizado para listas, enquanto sorted() produz uma nova lista ordenada e suporta diversos iteráveis, como strings, tuplas e dicionários.

Utilizando sort()

Ordenação básica de uma lista numérica:

numeros = [4, 5, 2, 6, 7, 0, 1, 8]
numeros.sort()
print(numeros)
# Resultado: [0, 1, 2, 4, 5, 6, 7, 8]

Ordenação de lista com sublistas, usendo uma chave personalizada:

pessoas = [['Ana', '170', '55'], ['Carlos', '180', '70'], ['Beatriz', '165', '60']]
pessoas.sort(key=lambda pessoa: pessoa[2])
print(pessoas)
# Resultado: [['Ana', '170', '55'], ['Carlos', '180', '70'], ['Beatriz', '165', '60']]

Utilizando sorted()

Para strings, a ordenação retorna uma lista de caracteres:

palavra = 'Python'
print(sorted(palavra, reverse=False))
print(sorted(palavra, reverse=True))
# Resultados: ['P', 'h', 'n', 'o', 't', 'y'] e ['y', 't', 'o', 'n', 'h', 'P']

Tuplas são tratadas de forma semelhante a listas:

tupla_valores = (5, 6, 2, 3, 1, 9, 7)
print(sorted(tupla_valores))
print(sorted(tupla_valores, reverse=True))
# Resultados: [1, 2, 3, 5, 6, 7, 9] e [9, 7, 6, 5, 3, 2, 1]

Listas podem ser ordenadas diretamente com sorted():

lista_exemplo = [4, 2, 5, 9, 6, 0]
print(sorted(lista_exemplo))
print(sorted(lista_exemplo, reverse=True))
# Resultados: [0, 2, 4, 5, 6, 9] e [9, 6, 5, 4, 2, 0]

Dicionários podem ser ordenados por chave ou valor. Para ordenar por chave em ordem decrescente:

dados_dict = {"a": "2", "b": "8", "c": "6"}
itens_ordenados = sorted(dados_dict.items(), key=lambda par: par[0], reverse=True)
print(itens_ordenados)
# Resultado: [('c', '6'), ('b', '8'), ('a', '2')]

Para ordenar por valor em ordem decrescente:

dados_dict = {"a": "2", "b": "8", "c": "6"}
itens_ordenados = sorted(dados_dict.items(), key=lambda par: par[1], reverse=True)
print(itens_ordenados)
# Resultado: [('b', '8'), ('c', '6'), ('a', '2')]

Técnicas de ordenação em estruturas aninhadas

1. Lista de dicionários, ordenando por um valor específico em ordem decrescente.

1.1 Usando uma expressão lambda:

usuarios = [{"nome": "João", "idade": 25}, {"nome": "Maria", "idade": 30}]
usuarios_ordenados = sorted(usuarios, key=lambda usuario: usuario['idade'], reverse=True)
print(usuarios_ordenados)
# Resultado: [{'nome': 'Maria', 'idade': 30}, {'nome': 'João', 'idade': 25}]

1.2 Utilizando o módulo operator para simplificar:

import operator
usuarios = [{"nome": "João", "idade": 25}, {"nome": "Maria", "idade": 30}]
usuarios.sort(key=operator.itemgetter('idade'), reverse=True)
print(usuarios)
# Resultado: [{'nome': 'Maria', 'idade': 30}, {'nome': 'João', 'idade': 25}]

2. Quando a lista contém dicionários com chaves distintas, pode-se fundi-los em um único dicionário para ordenação:

from operator import itemgetter

lista_de_dic = [{"min": 89}, {"fei": 90}, {"hao": 84}, {"jhon": 98}]
dic_agregado = {chave: valor for item in lista_de_dic for chave, valor in item.items()}
print(dic_agregado)
itens_ordenados = sorted(dic_agregado.items(), key=itemgetter(1))
print(itens_ordenados)
resultado_final = [{chave: valor for chave, valor in itens_ordenados}]
print(resultado_final)
# Resultados: {'min': 89, 'fei': 90, 'hao': 84, 'jhon': 98}, [('hao', 84), ('min', 89), ('fei', 90), ('jhon', 98)], [{'hao': 84, 'min': 89, 'fei': 90, 'jhon': 98}]

3. Dicionários aninhados podem ser ordenados com base em valores internos:

dic_aninhado = {10: {"campo1": 1, "campo2": 2}, 11: {"campo1": 2, "campo2": 0}, 12: {"campo1": 0, "campo2": 3}}
ordenado_por_campo2 = sorted(dic_aninhado.items(), key=lambda item: item[1]['campo2'])
print(ordenado_por_campo2)
# Resultado: [(11, {'campo1': 2, 'campo2': 0}), (10, {'campo1': 1, 'campo2': 2}), (12, {'campo1': 0, 'campo2': 3})]

Tags: Python sorting dicionários listas Lambda

Publicado em 6-16 18:27 por Thomas