Re: SortBy won't order irrationals
- To: mathgroup at smc.vnet.net
- Subject: [mg124044] Re: SortBy won't order irrationals
- From: DrMajorBob <btreat1 at austin.rr.com>
- Date: Sat, 7 Jan 2012 05:17:44 -0500 (EST)
- Delivered-to: l-mathgroup@mail-archive0.wolfram.com
- References: <201201060916.EAA26862@smc.vnet.net>
- Reply-to: drmajorbob at yahoo.com
Here's an ordering for irrationals on the second element:
pts = {{0, 2}, {1, Sqrt[2]}, {2, 2}, {4, 1}, {Sqrt[5], 1}, {6,
1}, {Sqrt[3], 1}, {7, 0}, {-1, 0}};
pts[[Ordering[pts[[All, 2]], All, Less]]]
{{-1, 0}, {7, 0}, {Sqrt[3], 1}, {6, 1}, {Sqrt[5], 1}, {4, 1}, {1,
Sqrt[2]}, {2, 2}, {0, 2}}
And here's a sort by multiple keys (3rd element then 2nd).
sample data:
threes = RandomChoice[Flatten@pts, {10, 3}]
{{7, 2, -1}, {Sqrt[3], 1, Sqrt[3]}, {2, 0, 0}, {2, 1, 1}, {1, Sqrt[
5], -1}, {0, 1, 4}, {2, 2, 2}, {1, 1, -1}, {0, 2, Sqrt[5]}, {Sqrt[
5], 0, 0}}
sort:
Fold[#1[[Ordering[#1[[All, #2]], All, LessEqual]]] &, threes,
Reverse@{3, 1}]
{{1, Sqrt[5], -1}, {1, 1, -1}, {7, 2, -1}, {2, 0, 0}, {Sqrt[5], 0,
0}, {2, 1, 1}, {Sqrt[3], 1, Sqrt[3]}, {2, 2, 2}, {0, 2, Sqrt[
5]}, {0, 1, 4}}
or
Fold[#1[[Ordering[#1[[All, #2]], All, LessEqual]]] &, threes,
Reverse@{3, 1, 2}]
{{1, 1, -1}, {1, Sqrt[5], -1}, {7, 2, -1}, {2, 0, 0}, {Sqrt[5], 0,
0}, {2, 1, 1}, {Sqrt[3], 1, Sqrt[3]}, {2, 2, 2}, {0, 2, Sqrt[
5]}, {0, 1, 4}}
(The sort by 2nd element does nothing in that case.)
The Fold method generalizes. For instance, to order on Sin of 3rd element,
Abs of 1st, and Cos of 2nd:
Clear[order]
order[list_List, {n_Integer, f_}] :=
list[[Ordering[f@list[[All, n]], All, LessEqual]]]
sorted = Fold[order, threes, Reverse@{{3, Sin}, {1, Abs}, {2, Cos}}]
{{1, Sqrt[5], -1}, {1, 1, -1}, {7, 2, -1}, {0, 1, 4}, {2, 0,
0}, {Sqrt[5], 0, 0}, {0, 2, Sqrt[5]}, {2, 1, 1}, {2, 2, 2}, {Sqrt[
3], 1, Sqrt[3]}}
To see if this worked properly:
sorted /. {x_, y_, z_} :> N@{Sin@z, Abs@x, Cos@y};
% == Sort@%
True
Bobby
On Fri, 06 Jan 2012 03:16:42 -0600, Chris Young <cy56 at comcast.net> wrote:
> Have to use N[ ] on them first. Combined with Sort's refusal to accept
> multiple keys, this is extremely exasperating.
>
> In[1218]:= ptsIrr =
> {
> {0, 2}, {1, Sqrt[2]}, {2, 2},
> {4, 1}, {Sqrt[5], 1}, {6, 1}, {Sqrt[3], 1},
> {7, 0}, {-1, 0}
> }
>
> Out[1218]= {{0, 2}, {1, Sqrt[2]}, {2, 2}, {4, 1}, {Sqrt[5], 1}, {6,
> 1}, {Sqrt[3], 1}, {7, 0}, {-1, 0}}
>
> In[1219]:= sortIrrY = SortBy[ptsIrr, #[[2]] &]
>
> Out[1219]= {{-1, 0}, {7, 0}, {4, 1}, {6, 1}, {Sqrt[3], 1}, {Sqrt[5],
> 1}, {0, 2}, {2, 2}, {1, Sqrt[2]}}
>
> In[1220]:= sortIrrYN = SortBy[ptsIrr // N, #[[2]] &]
>
> Out[1220]= {{-1., 0.}, {7., 0.}, {1.73205, 1.}, {2.23607, 1.}, {4.,
> 1.}, {6., 1.}, {1., 1.41421}, {0., 2.}, {2., 2.}}
>
> In[1221]:= sortIrrYN2 = SortBy[ptsIrr, N[#[[2]]] &]
>
> Out[1221]= {{-1, 0}, {7, 0}, {4, 1}, {6, 1}, {Sqrt[3], 1}, {Sqrt[5],
> 1}, {1, Sqrt[2]}, {0, 2}, {2, 2}}
>
>
--
DrMajorBob at yahoo.com
- References:
- SortBy won't order irrationals
- From: Chris Young <cy56@comcast.net>
- SortBy won't order irrationals