Tag Info

Hot answers tagged

12

Here's another way you might approach this kind of thing -- instead of assigning values to the variables using =, you can make them into rules. For example, here is a collection of "variable names" and values for those variables, and a rule to make the assignment explicit: vars = {a, b, c, d, e}; vals = {5, 4, 3, 2, 1.1}; Thread[Rule[vars, vals]] {a -> ...


11

I do not believe that this behaviour is a bug. The correct usage would be SortBy[#age&] or SortBy[Key@"age"]. The rest of this response will explain these assertions. The crucial point is that the "age" argument in SortBy["age"] is not conferred with any special meaning on account of SortBy being used as a Dataset operator. In the absence of such ...


10

To sort by a specific element use a pure function with the number in question. For your case (the second element) just do: SortBy[a, #[[2]] &] {{7, 1, 4}, {1, 2, 3}, {12, 4, 8}, {3, 5, 6}, {10, 7, 1}} You can also use Sort like this: Sort[a, #1[[2]] < #2[[2]] &]


9

You have to use a pure function also for SortBy titanic[Select[#age > 65 &] /* SortBy[#age &]] Since #age will pick out the values of the key "age" in the association.


9

I don't know exactly why Mathematica is giving a wrong result, but here's a workaround: SortBy[{{4/13 (-9 - Sqrt[3]), 6/13 (4 - Sqrt[3])}, {4/13 (-9 + Sqrt[3]), 6/13 (4 + Sqrt[3])}}, -N @ #[[2]] &] That is, force Mathematica to sort by their numerical value. OR you can use Sort instead: Sort[{{4/13 (-9 - Sqrt[3]), 6/13 (4 - Sqrt[3])}, ...


9

Unless you use := for varList definition. a,b... are lost. Here's more about that, in related Q&A: Generate list of strings from a list of assigned variables. So: a = 5; b = 4; c = 3; d = 2; e = 1; varList := {a, b, c, d, e}; (Defer[varList] /. OwnValues[varList])[[{1}, Ordering[varList]]] {e, d, c, b, a}


8

Likely something like the following: Import[#, "PNG"] & /@ SortBy[FileNames[importString], FileDate[#,"Creation"]&] although I suspect there might be a more terse approach.


8

If your operation can be converted to a canonical ranking rather than a pairwise comparison then you can use MaximalBy introduced in version 10. If not a good approach to a single pass through a list is Fold. Here is a function using that: foldMax[list_, p_] := Fold[If[p[##], ##] &, list] This proves to be faster in some cases than using Ordering ...


7

If this is a bug it runs far deeper than SortBy. Since no one has yet been able to provide a reference for the intended ordering of Sort etc. it is hard to say with certainty. I can demonstrate that Sort, Ordering and Order all agree, even if I can't justify that result. x = {6/13 (4 - Sqrt[3]), 6/13 (4 + Sqrt[3])}; Outer[#@#2 &, {Order @@ # &, ...


7

Edit: 4x faster after refactoring and using {# - #2, +##} &[+##, Abs[# - #2]] & instead of Sort/@. Let we have the following 1D intervals $$ [a_1,b_1], [a_2,b_2], [a_3, b_3]. $$ Then we can take all these edges of intervals and sort them. For example, ...


6

dateOrdered = ((names = FileNames["*.dat"])[[Ordering[ FileDate[#, "Modification"] & /@ names]]]); data = Import[#, "Table"] & /@ dateOrdered; This will import with oldest modification date first, most recent last.


6

I think this does what you want: Less @@ SortBy[Defer[Subscript[ω, #]] & /@ {1, 2, 11, 22}, N @@ # &]


6

There is also ... Ordering ClearAll[sortBy]; sortBy[list_, column_, ord_: Less] := list[[Ordering[list[[All, column]], All, ord]]] Examples: a = {{1, 2, 3}, {7, 1, 4}, {3, 5, 6}, {10, 7, 1}, {12, 4, 8}}; sortBy[a, 2] (* {{7,1,4},{1,2,3},{12,4,8},{3,5,6},{10,7,1}} *) sortBy[a, 2, Greater] (* {{10,7,1},{3,5,6},{12,4,8},{1,2,3},{7,1,4}} *) ...


6

As a followup to the answer by bill s, as of version 10, you should consider using Association instead of lists of rules. In this case, you could do the following: Sort[AssociationThread[{a, b, c, d, e}, {5, 4, 3, 2, 1.1}]] (* <|e -> 1.1, d -> 2, c -> 3, b -> 4, a -> 5|> *) and then Keys@% (* {e, d, c, b, a} *)


5

In version 10, you can use MeshCoordinates[ConvexHullMesh[...]] as in RunnyKine's answer, but you need to re-order them using MeshCells: pentagon=N@Table[{Cos[2 Pi k /5], Sin[2 Pi k /5]}, {k, 5}] points = N@RandomSample[Join[pentagon, {{0, 0}}]] chm=ConvexHullMesh[points]; ordering=MeshCells[chm,2][[1,1]] out=MeshCoordinates[chm][[ordering]] ...


5

The sorting (ordering) done by Union is different for different forms of expressions, e.g., analytic versus numeric expressions for a number. Union[{2., (Sqrt[5] + 1)/2}] {2., 1/2 (1 + Sqrt[5])} % // N {2., 1.61803} Union[{2., (Sqrt[5] + 1.0)/2}] {1.61803, 2.} SortBy[{2., (Sqrt[5] + 1)/2}, N] {1/2 (1 + Sqrt[5]), 2.}


5

I am not familiar with the specific output format you need but I think I can show you how to proceed. dat = Import["ExampleData/caffeine.xyz", {{"VertexTypes", "VertexCoordinates"}}]; dat2 = {#[[1, 1]], #[[All, 2]]} & /@ GatherBy[dat\[Transpose], First]; dat3 = {#, Length@#2, #2} & @@@ dat2; dat3 has this format: dat3 // TableForm $\left( ...


5

Ordering[Ordering[data]] (* {3,1,2} *)


4

Edit: This question closely related to one asked on Stack Overflow before the existence of Mathematica.SE. Please see this link for the history and examples: Unsort: remembering a permutation and undoing it See also: Ordering@Ordering and Ranking Permutations The first Q&A references a use of the Ordering method shown below from 2007 on ...


4

Something like this? myinversions[list_] := Select[ Subsets[Range[Length[list]], {2}] , list[[#[[1]]]] > list[[#[[2]]]] & ] // Length Verify the same result as builtin Inversions for a permutation Needs["Combinatorica`"] And @@ (Inversions[#] == myinversions[#] & /@ Permutations[Range[5]]) True myinversions[{1, 4, 2, ...


4

I propose using Order, assuming equal-length lists. Order[{1, 3, 5}, {1, 3, 4}] Order[{1, 3, 5}, {1, 5, 2}] Order[{1, 3, 5}, {1, 3, 5}] -1 1 0 You can assign an infix operator if you wish: CirclePlus = Order; {1, 3, 5} ⊕ {1, 3, 4} {1, 3, 5} ⊕ {1, 5, 2} {1, 3, 5} ⊕ {1, 3, 5} -1 1 0 You can convert the numeric output to Boolean as needed, ...


3

If you have Version 10, you could use ConvexHullMesh. pts = RandomReal[{-10, 10}, {6, 2}]; You can then order them by doing: chull = ConvexHullMesh[pts]; And here are the points: MeshCoordinates[chull] Note: This does not always order the points but one can use MeshCells which will give the ordering correctly. See @kguler's answer.


3

Update: Still 4X slower than @Mr.W' method, but much faster than ones in the original post is invF5 = With[{ss = Subtract @@ Transpose[Subsets[#, {2}]]}, Total@UnitStep[ss]] & invF = Total@(1 - UnitStep[Order @@@ Subsets[#, {2}]]) & or invF2 = Count[Subsets[#, {2}], _?(Greater @@ # &)] &; or, variations on george2079's approach ...


3

L1 = {{"Australia", a1}, {"USA", a2}, {"Norway", a3}}; L2 = {{"USA", b1}, {"Norway", b2}, {"Australia", b3}}; L2[[Flatten[Position[First /@ L2, #] & /@ First /@ L1]]] {{"Australia", b3}, {"USA", b1}, {"Norway", b2}} Or (revised as per Mr. Wizard's comments) Sort[L2][[Ordering @ Ordering @ L1]] {{"Australia", b3}, {"USA", b1}, {"Norway", ...


3

l1 = {{"a", a1}, {"b", a2}, {"c", a3}} l2 = {{"c", b3}, {"b", b2}, {"a", b1}} {#, # /. Rule @@@ l2} &[l1[[All, 1]]] // Transpose (* {{"a", b1}, {"b", b2}, {"c", b3}} *)


3

This is ugly ;), but I think it is what you are after. Composition[ Row[#[[;; , 1]], " < "] &, SortBy[#, N[#[[2]]] &] &, ReleaseHold, MapAt[HoldForm, #, {1, ;; , 1}] &, # /. s_Subscript :> RuleCondition@{HoldForm[s], s /. k -> 1 /. m -> 1} & ]@Hold[{Subscript[ω, 1], Subscript[ω, 2], Subscript[ω, 11], Subscript[ω, ...


3

Using belisarius's test setup and a modification of the Ordering-based method: c = Transpose[{StringJoin /@ Permutations@Characters["123456789"], Range[9!]}]; M = Join[c, c, c]; ClearSystemCache[]; Print@Timing[l1=Reverse@SortBy[Most@M, Last]~Join~{Last@M};]; ClearSystemCache[]; Print@Timing[l2= M[[Ordering[M[[;; -2, 2]], All, Greater]]]~Join~{Last@M};]; ...


3

list1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; list2 = {"It", "is", "only", "the", "morning", "the", "man", "complained", "I", "shall", "consider", "nothing"}; GatherBy[Transpose[{list1, list2}], Mod[#[[1]], 3] &][[All, All, 2]] (* {{"It", "the", "man", "shall"}, {"is", "morning", "complained", "consider"}, {"only", "the", "I", ...


3

You could use Hold instead of List in varList: a = 5; b = 4; c = 3; d = 2; e = 1; varList = Hold[a, b, c, d, e]; SortBy[varList, # &] (* Hold[e, d, c, b, a] *)


3

f[x_] := StringTake[IntegerString[Hash[ToString@x, "SHA256"], 16], -4] (* tiny version of requested function *) Clear[collision]; collision::usage = "store potential collisions as downvalues"; collision[_] = {}; Block[ {y}, For[i = 1, i <= 1000, i++, y = f[i]; collision[y] = Append[collision[y], i] ] ]; Sort[Select[#[[1, 1, 1]] -> ...



Only top voted, non community-wiki answers of a minimum length are eligible