Sort with assumptions












6












$begingroup$


I have a list which looks like this



list = {0, Subscript[x,7], -Subscript[x,3]-Subscript[x,9], -Subscript[x,9]};



and all the $x_i$'s are positive semidefinite (i.e. nonnegative) real numbers. I would like to be able to sort this into



sortedlist = {-Subscript[x,3]-Subscript[x,9], -Subscript[x,9], 0, Subscript[x,7]}



How do I achieve this? I tried



Assuming[Subscript[x,3] > 0 && Subscript[x,7] > 0 && Subscript[x,9] > 0, Sort[list]]



But this obviously does not work. In general, I'd like to be able to impose more constraints on the $x_i's$ when they're being sorted.










share|improve this question









$endgroup$








  • 1




    $begingroup$
    An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
    $endgroup$
    – mikado
    yesterday
















6












$begingroup$


I have a list which looks like this



list = {0, Subscript[x,7], -Subscript[x,3]-Subscript[x,9], -Subscript[x,9]};



and all the $x_i$'s are positive semidefinite (i.e. nonnegative) real numbers. I would like to be able to sort this into



sortedlist = {-Subscript[x,3]-Subscript[x,9], -Subscript[x,9], 0, Subscript[x,7]}



How do I achieve this? I tried



Assuming[Subscript[x,3] > 0 && Subscript[x,7] > 0 && Subscript[x,9] > 0, Sort[list]]



But this obviously does not work. In general, I'd like to be able to impose more constraints on the $x_i's$ when they're being sorted.










share|improve this question









$endgroup$








  • 1




    $begingroup$
    An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
    $endgroup$
    – mikado
    yesterday














6












6








6


3



$begingroup$


I have a list which looks like this



list = {0, Subscript[x,7], -Subscript[x,3]-Subscript[x,9], -Subscript[x,9]};



and all the $x_i$'s are positive semidefinite (i.e. nonnegative) real numbers. I would like to be able to sort this into



sortedlist = {-Subscript[x,3]-Subscript[x,9], -Subscript[x,9], 0, Subscript[x,7]}



How do I achieve this? I tried



Assuming[Subscript[x,3] > 0 && Subscript[x,7] > 0 && Subscript[x,9] > 0, Sort[list]]



But this obviously does not work. In general, I'd like to be able to impose more constraints on the $x_i's$ when they're being sorted.










share|improve this question









$endgroup$




I have a list which looks like this



list = {0, Subscript[x,7], -Subscript[x,3]-Subscript[x,9], -Subscript[x,9]};



and all the $x_i$'s are positive semidefinite (i.e. nonnegative) real numbers. I would like to be able to sort this into



sortedlist = {-Subscript[x,3]-Subscript[x,9], -Subscript[x,9], 0, Subscript[x,7]}



How do I achieve this? I tried



Assuming[Subscript[x,3] > 0 && Subscript[x,7] > 0 && Subscript[x,9] > 0, Sort[list]]



But this obviously does not work. In general, I'd like to be able to impose more constraints on the $x_i's$ when they're being sorted.







list-manipulation symbolic array sorting






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked yesterday









leastactionleastaction

244210




244210








  • 1




    $begingroup$
    An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
    $endgroup$
    – mikado
    yesterday














  • 1




    $begingroup$
    An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
    $endgroup$
    – mikado
    yesterday








1




1




$begingroup$
An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
$endgroup$
– mikado
yesterday




$begingroup$
An interesting idea, but a symbolic list where you have an ordering for all the elements is rare
$endgroup$
– mikado
yesterday










4 Answers
4






active

oldest

votes


















5












$begingroup$

Here is a possibility:



sortWithAssumptions[list_, assum_] := Module[{order},
order[a_, b_] := Simplify[a < b, assum];
Sort[list, order]
]


For your example:



sortWithAssumptions[
{0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9]},
Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0
] //TeXForm



$left{-x_3-x_9,-x_9,0,x_7right}$




Another example:



sortWithAssumptions[
{0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9], Subscript[x,9]},
Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0&&Subscript[x,7]<Subscript[x,9]
] //TeXForm



$left{-x_3-x_9,-x_9,0,x_7,x_9right}$







share|improve this answer









$endgroup$













  • $begingroup$
    Thank you, Carl!
    $endgroup$
    – leastaction
    yesterday



















5












$begingroup$

How about:



list[[Ordering[list /. _Subscript -> 1]]]



{-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]}




So basically we sort it the way it would be sorted with all subscripts == 1.






share|improve this answer









$endgroup$













  • $begingroup$
    Thanks! Seems to work like a charm, but can you shed some light on why?
    $endgroup$
    – leastaction
    yesterday










  • $begingroup$
    @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
    $endgroup$
    – Kuba
    yesterday










  • $begingroup$
    I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
    $endgroup$
    – leastaction
    yesterday






  • 1




    $begingroup$
    @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
    $endgroup$
    – Kuba
    yesterday





















4












$begingroup$

Sort[list, TrueQ@Simplify[#1 < #2, _Subscript > 0] &]

(* Out: {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)





share|improve this answer









$endgroup$





















    4












    $begingroup$

    In this case, we can use RankedMin and FullSimplify to get the answer you seek



    Assuming[
    Subscript[x, 3] > 0 && Subscript[x, 7] > 0 && Subscript[x, 9] > 0,
    FullSimplify[Table[RankedMin[list, i], {i, 1, Length[list]}]]]
    (* {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)


    This has the advantage of not returning a (potentially) wrong answer if the sort order is uncertain.






    share|improve this answer











    $endgroup$













      Your Answer





      StackExchange.ifUsing("editor", function () {
      return StackExchange.using("mathjaxEditing", function () {
      StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
      StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
      });
      });
      }, "mathjax-editing");

      StackExchange.ready(function() {
      var channelOptions = {
      tags: "".split(" "),
      id: "387"
      };
      initTagRenderer("".split(" "), "".split(" "), channelOptions);

      StackExchange.using("externalEditor", function() {
      // Have to fire editor after snippets, if snippets enabled
      if (StackExchange.settings.snippets.snippetsEnabled) {
      StackExchange.using("snippets", function() {
      createEditor();
      });
      }
      else {
      createEditor();
      }
      });

      function createEditor() {
      StackExchange.prepareEditor({
      heartbeatType: 'answer',
      autoActivateHeartbeat: false,
      convertImagesToLinks: false,
      noModals: true,
      showLowRepImageUploadWarning: true,
      reputationToPostImages: null,
      bindNavPrevention: true,
      postfix: "",
      imageUploader: {
      brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
      contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
      allowUrls: true
      },
      onDemand: true,
      discardSelector: ".discard-answer"
      ,immediatelyShowMarkdownHelp:true
      });


      }
      });














      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193600%2fsort-with-assumptions%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      4 Answers
      4






      active

      oldest

      votes








      4 Answers
      4






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes









      5












      $begingroup$

      Here is a possibility:



      sortWithAssumptions[list_, assum_] := Module[{order},
      order[a_, b_] := Simplify[a < b, assum];
      Sort[list, order]
      ]


      For your example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7right}$




      Another example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9], Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0&&Subscript[x,7]<Subscript[x,9]
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7,x_9right}$







      share|improve this answer









      $endgroup$













      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        yesterday
















      5












      $begingroup$

      Here is a possibility:



      sortWithAssumptions[list_, assum_] := Module[{order},
      order[a_, b_] := Simplify[a < b, assum];
      Sort[list, order]
      ]


      For your example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7right}$




      Another example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9], Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0&&Subscript[x,7]<Subscript[x,9]
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7,x_9right}$







      share|improve this answer









      $endgroup$













      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        yesterday














      5












      5








      5





      $begingroup$

      Here is a possibility:



      sortWithAssumptions[list_, assum_] := Module[{order},
      order[a_, b_] := Simplify[a < b, assum];
      Sort[list, order]
      ]


      For your example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7right}$




      Another example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9], Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0&&Subscript[x,7]<Subscript[x,9]
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7,x_9right}$







      share|improve this answer









      $endgroup$



      Here is a possibility:



      sortWithAssumptions[list_, assum_] := Module[{order},
      order[a_, b_] := Simplify[a < b, assum];
      Sort[list, order]
      ]


      For your example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7right}$




      Another example:



      sortWithAssumptions[
      {0,Subscript[x,7],-Subscript[x,3]-Subscript[x,9],-Subscript[x,9], Subscript[x,9]},
      Subscript[x,3]>0&&Subscript[x,7]>0&&Subscript[x,9]>0&&Subscript[x,7]<Subscript[x,9]
      ] //TeXForm



      $left{-x_3-x_9,-x_9,0,x_7,x_9right}$








      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered yesterday









      Carl WollCarl Woll

      70.9k394185




      70.9k394185












      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        yesterday


















      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        yesterday
















      $begingroup$
      Thank you, Carl!
      $endgroup$
      – leastaction
      yesterday




      $begingroup$
      Thank you, Carl!
      $endgroup$
      – leastaction
      yesterday











      5












      $begingroup$

      How about:



      list[[Ordering[list /. _Subscript -> 1]]]



      {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]}




      So basically we sort it the way it would be sorted with all subscripts == 1.






      share|improve this answer









      $endgroup$













      • $begingroup$
        Thanks! Seems to work like a charm, but can you shed some light on why?
        $endgroup$
        – leastaction
        yesterday










      • $begingroup$
        @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
        $endgroup$
        – Kuba
        yesterday










      • $begingroup$
        I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
        $endgroup$
        – leastaction
        yesterday






      • 1




        $begingroup$
        @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
        $endgroup$
        – Kuba
        yesterday


















      5












      $begingroup$

      How about:



      list[[Ordering[list /. _Subscript -> 1]]]



      {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]}




      So basically we sort it the way it would be sorted with all subscripts == 1.






      share|improve this answer









      $endgroup$













      • $begingroup$
        Thanks! Seems to work like a charm, but can you shed some light on why?
        $endgroup$
        – leastaction
        yesterday










      • $begingroup$
        @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
        $endgroup$
        – Kuba
        yesterday










      • $begingroup$
        I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
        $endgroup$
        – leastaction
        yesterday






      • 1




        $begingroup$
        @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
        $endgroup$
        – Kuba
        yesterday
















      5












      5








      5





      $begingroup$

      How about:



      list[[Ordering[list /. _Subscript -> 1]]]



      {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]}




      So basically we sort it the way it would be sorted with all subscripts == 1.






      share|improve this answer









      $endgroup$



      How about:



      list[[Ordering[list /. _Subscript -> 1]]]



      {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]}




      So basically we sort it the way it would be sorted with all subscripts == 1.







      share|improve this answer












      share|improve this answer



      share|improve this answer










      answered yesterday









      KubaKuba

      107k12210530




      107k12210530












      • $begingroup$
        Thanks! Seems to work like a charm, but can you shed some light on why?
        $endgroup$
        – leastaction
        yesterday










      • $begingroup$
        @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
        $endgroup$
        – Kuba
        yesterday










      • $begingroup$
        I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
        $endgroup$
        – leastaction
        yesterday






      • 1




        $begingroup$
        @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
        $endgroup$
        – Kuba
        yesterday




















      • $begingroup$
        Thanks! Seems to work like a charm, but can you shed some light on why?
        $endgroup$
        – leastaction
        yesterday










      • $begingroup$
        @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
        $endgroup$
        – Kuba
        yesterday










      • $begingroup$
        I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
        $endgroup$
        – leastaction
        yesterday






      • 1




        $begingroup$
        @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
        $endgroup$
        – Kuba
        yesterday


















      $begingroup$
      Thanks! Seems to work like a charm, but can you shed some light on why?
      $endgroup$
      – leastaction
      yesterday




      $begingroup$
      Thanks! Seems to work like a charm, but can you shed some light on why?
      $endgroup$
      – leastaction
      yesterday












      $begingroup$
      @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
      $endgroup$
      – Kuba
      yesterday




      $begingroup$
      @leastaction just take a look at list /. _Subscript -> 1 and at Ordering[list /. _Subscript -> 1].
      $endgroup$
      – Kuba
      yesterday












      $begingroup$
      I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
      $endgroup$
      – leastaction
      yesterday




      $begingroup$
      I see, so you basically assigned the value $x_i = 1$ to each $x_i$. It works in this case, but generically, $x_i$'s may be different.
      $endgroup$
      – leastaction
      yesterday




      1




      1




      $begingroup$
      @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
      $endgroup$
      – Kuba
      yesterday






      $begingroup$
      @leastaction sure, which means there isn't only one correct answer and every valid within constraints is correct.
      $endgroup$
      – Kuba
      yesterday













      4












      $begingroup$

      Sort[list, TrueQ@Simplify[#1 < #2, _Subscript > 0] &]

      (* Out: {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)





      share|improve this answer









      $endgroup$


















        4












        $begingroup$

        Sort[list, TrueQ@Simplify[#1 < #2, _Subscript > 0] &]

        (* Out: {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)





        share|improve this answer









        $endgroup$
















          4












          4








          4





          $begingroup$

          Sort[list, TrueQ@Simplify[#1 < #2, _Subscript > 0] &]

          (* Out: {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)





          share|improve this answer









          $endgroup$



          Sort[list, TrueQ@Simplify[#1 < #2, _Subscript > 0] &]

          (* Out: {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)






          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered yesterday









          MarcoBMarcoB

          37.7k556113




          37.7k556113























              4












              $begingroup$

              In this case, we can use RankedMin and FullSimplify to get the answer you seek



              Assuming[
              Subscript[x, 3] > 0 && Subscript[x, 7] > 0 && Subscript[x, 9] > 0,
              FullSimplify[Table[RankedMin[list, i], {i, 1, Length[list]}]]]
              (* {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)


              This has the advantage of not returning a (potentially) wrong answer if the sort order is uncertain.






              share|improve this answer











              $endgroup$


















                4












                $begingroup$

                In this case, we can use RankedMin and FullSimplify to get the answer you seek



                Assuming[
                Subscript[x, 3] > 0 && Subscript[x, 7] > 0 && Subscript[x, 9] > 0,
                FullSimplify[Table[RankedMin[list, i], {i, 1, Length[list]}]]]
                (* {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)


                This has the advantage of not returning a (potentially) wrong answer if the sort order is uncertain.






                share|improve this answer











                $endgroup$
















                  4












                  4








                  4





                  $begingroup$

                  In this case, we can use RankedMin and FullSimplify to get the answer you seek



                  Assuming[
                  Subscript[x, 3] > 0 && Subscript[x, 7] > 0 && Subscript[x, 9] > 0,
                  FullSimplify[Table[RankedMin[list, i], {i, 1, Length[list]}]]]
                  (* {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)


                  This has the advantage of not returning a (potentially) wrong answer if the sort order is uncertain.






                  share|improve this answer











                  $endgroup$



                  In this case, we can use RankedMin and FullSimplify to get the answer you seek



                  Assuming[
                  Subscript[x, 3] > 0 && Subscript[x, 7] > 0 && Subscript[x, 9] > 0,
                  FullSimplify[Table[RankedMin[list, i], {i, 1, Length[list]}]]]
                  (* {-Subscript[x, 3] - Subscript[x, 9], -Subscript[x, 9], 0, Subscript[x, 7]} *)


                  This has the advantage of not returning a (potentially) wrong answer if the sort order is uncertain.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited yesterday

























                  answered yesterday









                  mikadomikado

                  6,7171929




                  6,7171929






























                      draft saved

                      draft discarded




















































                      Thanks for contributing an answer to Mathematica Stack Exchange!


                      • Please be sure to answer the question. Provide details and share your research!

                      But avoid



                      • Asking for help, clarification, or responding to other answers.

                      • Making statements based on opinion; back them up with references or personal experience.


                      Use MathJax to format equations. MathJax reference.


                      To learn more, see our tips on writing great answers.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f193600%2fsort-with-assumptions%23new-answer', 'question_page');
                      }
                      );

                      Post as a guest















                      Required, but never shown





















































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown

































                      Required, but never shown














                      Required, but never shown












                      Required, but never shown







                      Required, but never shown







                      Popular posts from this blog

                      How did Captain America manage to do this?

                      迪纳利

                      南乌拉尔铁路局