Te hago la tarea, pero con estilo

Pasa siempre, como en todas las listas de programación, que de vez en cuando alguien postea en la lista de Python Argentina algo que es obviamente su tarea para el hogar. Para manejarlo hay dos escuelas de pensamiento:

  1. Mostrarle como se hace es decirle como hacer trampa.
  2. Mostrarle como se hace es enseñarle.

Yo me inclino más por 1) pero creo haber encontrado un camino intermedio:

1.5) Darle una solución más complicada que el problema.

De esa manera, si entiende la solución, ya hizo el trabajo. Y si no la entiende, va a ser tan obvio que no la entiende, que el profesor nunca le va a aceptar la respuesta.

Como ejemplo, este es el problema que presentaron en PyAr:

La lista viene desordenada y con dos caracteres (uno en minúscula y otro en mayúscula), por ejemplo:

['eD', 'fC', 'hC', 'iC', 'jD', 'bD', 'fH', 'mS', 'aS', 'mD']

Para ordenarla debo seguir estas pautas:

  1. Armar subconjuntos de acuerdo a la mayúscula y luego ordenar esos subconjuntos por la cantidad de miembros (en orden ascendente), la lista queda de la siguiente forma:

    ['fH', 'mS', 'aS', 'fC', 'hC', 'iC', 'jD', 'bD', 'eD', 'mD']
    
  2. Ahora cada subconjunto debe estar ordenado de manera ascendente y de acuerdo a la minúscula, con lo que la lista queda ordenada así:

    ['fH', 'aS', 'mS', 'fC', 'hC', 'iC', 'bD', 'eD', 'jD', 'mD']
    

Ignorando que el planteo es ambiguo (hay por lo menos dos maneras de leerlo, capaz que más), yo propuse esta solución, que requiere python 3:

from collections import defaultdict
d1 = defaultdict(list)
[d1[i[1]].append(i) for i in  ['eD', 'fC', 'hC', 'iC', 'jD', 'bD', 'fH', 'mS', 'aS', 'mD']]
{i: d1[i].sort() for i in d1}
d2 = {len(d1[i]): d1[i] for i in d1}
print([item for sublist in [d2[i] for i in sorted(d2.keys())] for item in sublist])

Produce el resultado deseado: ['fH', 'aS', 'mS', 'fC', 'hC', 'iC', 'bD', 'eD', 'jD', 'mD'] pero de una manera que para entenderlo, el alumno necesita saber mas de lo que requiere el problema original, incluyendo tres o cuatro cosas que no creo que le hayan enseñado.