Sort with assumptions












4












$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
    20 mins ago
















4












$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
    20 mins ago














4












4








4


1



$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 42 mins ago









leastactionleastaction

22729




22729








  • 1




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














  • 1




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








1




1




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




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










4 Answers
4






active

oldest

votes


















2












$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
    13 mins ago



















3












$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
    20 mins ago










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










  • $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
    16 mins ago






  • 1




    $begingroup$
    @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
    $endgroup$
    – Kuba
    13 mins ago



















2












$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$





















    2












    $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









      2












      $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
        13 mins ago
















      2












      $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
        13 mins ago














      2












      2








      2





      $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 16 mins ago









      Carl WollCarl Woll

      70.8k394184




      70.8k394184












      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        13 mins ago


















      • $begingroup$
        Thank you, Carl!
        $endgroup$
        – leastaction
        13 mins ago
















      $begingroup$
      Thank you, Carl!
      $endgroup$
      – leastaction
      13 mins ago




      $begingroup$
      Thank you, Carl!
      $endgroup$
      – leastaction
      13 mins ago











      3












      $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
        20 mins ago










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










      • $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
        16 mins ago






      • 1




        $begingroup$
        @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
        $endgroup$
        – Kuba
        13 mins ago
















      3












      $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
        20 mins ago










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










      • $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
        16 mins ago






      • 1




        $begingroup$
        @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
        $endgroup$
        – Kuba
        13 mins ago














      3












      3








      3





      $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 23 mins ago









      KubaKuba

      106k12209530




      106k12209530












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










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










      • $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
        16 mins ago






      • 1




        $begingroup$
        @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
        $endgroup$
        – Kuba
        13 mins ago


















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










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










      • $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
        16 mins ago






      • 1




        $begingroup$
        @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
        $endgroup$
        – Kuba
        13 mins ago
















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




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












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




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












      $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
      16 mins ago




      $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
      16 mins ago




      1




      1




      $begingroup$
      @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
      $endgroup$
      – Kuba
      13 mins ago




      $begingroup$
      @leastaction sure, which means there isn't one correct answer so every valid within constraints is correct?
      $endgroup$
      – Kuba
      13 mins ago











      2












      $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$


















        2












        $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$
















          2












          2








          2





          $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 16 mins ago









          MarcoBMarcoB

          37.6k556113




          37.6k556113























              2












              $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$


















                2












                $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$
















                  2












                  2








                  2





                  $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 8 mins ago

























                  answered 15 mins ago









                  mikadomikado

                  6,6971929




                  6,6971929






























                      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

                      Callistus I

                      Tabula Rosettana

                      How to label and detect the document text images