¿Hay una mejor manera de ordenar una lista por un valor de tuplas anidadas que escribir una alternativa itemgetter que extrae el valor tupla anidada:Ordenar la lista por tupla anidada valora
def deep_get(*idx):
def g(t):
for i in idx: t = t[i]
return t
return g
>>> l = [((2,1), 1),((1,3), 1),((3,6), 1),((4,5), 2)]
>>> sorted(l, key=deep_get(0,0))
[((1, 3), 1), ((2, 1), 1), ((3, 6), 1), ((4, 5), 2)]
>>> sorted(l, key=deep_get(0,1))
[((2, 1), 1), ((1, 3), 1), ((4, 5), 2), ((3, 6), 1)]
pensé acerca del uso de componer, pero eso es no en la biblioteca estándar:
sorted(l, key=compose(itemgetter(1), itemgetter(0))
¿hay algo que había perdido en las librerias que haría que el código más bonito?
La implementación debería funcionar razonablemente con 100k elementos.
Contexto: me gustaría ordenar un diccionario de elementos que son un histograma. Las claves son una tupla (a, b) y el valor es el recuento. Al final, los elementos se deben ordenar por conteo descendente, a y b. Una alternativa es aplanar la tupla y usar el elemento selector directamente, pero de esta manera se generarán muchas tuplas.
Hay ninguno que yo sepa Su enfoque es bueno, ya que es en mi humilde opinión. –
"La implementación debería funcionar razonablemente con 100k elementos". - esta línea es innecesaria; todas las implementaciones que usan 'sort' funcionarán razonablemente con 100k elementos – ninjagecko
@ninjagecko La implementación será diferente si ordena 3 elementos o 100k o 1T. –