2011-02-08 31 views
5

¿Cuál es una buena forma de ordenar todos los niveles de una expresión? A continuación se hace lo que quiere cuando la expresión tiene una estructura rectangular, pero me gustaría que trabajar para expresiones no rectangulares, asíOrdena todos los niveles de expresión

Map[Sort, {expr}, Depth[expr] - 1] 

Por ejemplo, el siguiente debe imprimir verdadera

sorted = deepSort[{{{1, 3, 8}, {3, 7, 6}, {10, 4, 9}, {3, 8, 10, 
     6}, {8, 2, 5, 10}, {8, 5, 10, 
     9}}, {{{1, 3, 8}, {3, 8, 10, 6}}, {{3, 7, 6}, {3, 8, 10, 
     6}}, {{10, 4, 9}, {8, 5, 10, 9}}, {{3, 8, 10, 6}, {8, 2, 5, 
     10}}, {{8, 2, 5, 10}, {8, 5, 10, 9}}}}]; 
checkSortedLevel[k_] := Map[OrderedQ, sorted, {k}]; 
And @@ Flatten[checkSortedLevel /@ Range[0, 2]] 

Respuesta

8

deepSort[expr_] := Map[Sort, expr, {0, -2}]

Tenga en cuenta que esto funcionará incluso si su expr contiene encabezados que no sean List.

3

Si tiene una expresión que contiene encabezados distintos de List y no desea ordenarlos, puede ser útil.

expr /. List :> Composition[Sort, List] 
+0

Nota para usted: _Don't fix what not not broke! _ –

Cuestiones relacionadas