Min and Max of a list of Associations











up vote
8
down vote

favorite
1












I am trying to find the minimum values for all elements in a list of associations, below is an example



x = {<|"a"-> 4, "b"->9, "c"->15|>, <|"a"->21, "b"->11, "c"->1|>, <|"a"->12, "b"->3, "c"->21|>}



Required output for Min
{<|"a"-> 2, "b"->3, "c"->1|>}



Required output for Max
{<|"a"-> 21, "b"->11, "c"->15|>}




My attempt
for Max: MaximalBy[Values]@x
Result: {<|"a" -> 21, "b" -> 11, "c" -> 1|>}



for Min: MinimalBy[Values]@x
Result: {<|"a" -> 4, "b" -> 9, "c" -> 15|>}



Is there an elegant way to achieve this result?










share|improve this question









New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
    – Shredderroy
    Dec 7 at 6:30















up vote
8
down vote

favorite
1












I am trying to find the minimum values for all elements in a list of associations, below is an example



x = {<|"a"-> 4, "b"->9, "c"->15|>, <|"a"->21, "b"->11, "c"->1|>, <|"a"->12, "b"->3, "c"->21|>}



Required output for Min
{<|"a"-> 2, "b"->3, "c"->1|>}



Required output for Max
{<|"a"-> 21, "b"->11, "c"->15|>}




My attempt
for Max: MaximalBy[Values]@x
Result: {<|"a" -> 21, "b" -> 11, "c" -> 1|>}



for Min: MinimalBy[Values]@x
Result: {<|"a" -> 4, "b" -> 9, "c" -> 15|>}



Is there an elegant way to achieve this result?










share|improve this question









New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
















  • 1




    I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
    – Shredderroy
    Dec 7 at 6:30













up vote
8
down vote

favorite
1









up vote
8
down vote

favorite
1






1





I am trying to find the minimum values for all elements in a list of associations, below is an example



x = {<|"a"-> 4, "b"->9, "c"->15|>, <|"a"->21, "b"->11, "c"->1|>, <|"a"->12, "b"->3, "c"->21|>}



Required output for Min
{<|"a"-> 2, "b"->3, "c"->1|>}



Required output for Max
{<|"a"-> 21, "b"->11, "c"->15|>}




My attempt
for Max: MaximalBy[Values]@x
Result: {<|"a" -> 21, "b" -> 11, "c" -> 1|>}



for Min: MinimalBy[Values]@x
Result: {<|"a" -> 4, "b" -> 9, "c" -> 15|>}



Is there an elegant way to achieve this result?










share|improve this question









New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











I am trying to find the minimum values for all elements in a list of associations, below is an example



x = {<|"a"-> 4, "b"->9, "c"->15|>, <|"a"->21, "b"->11, "c"->1|>, <|"a"->12, "b"->3, "c"->21|>}



Required output for Min
{<|"a"-> 2, "b"->3, "c"->1|>}



Required output for Max
{<|"a"-> 21, "b"->11, "c"->15|>}




My attempt
for Max: MaximalBy[Values]@x
Result: {<|"a" -> 21, "b" -> 11, "c" -> 1|>}



for Min: MinimalBy[Values]@x
Result: {<|"a" -> 4, "b" -> 9, "c" -> 15|>}



Is there an elegant way to achieve this result?







list-manipulation associations






share|improve this question









New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited Dec 7 at 6:22









C. E.

49.2k395199




49.2k395199






New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked Dec 7 at 5:39









Professor Williams

432




432




New contributor




Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Professor Williams is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.








  • 1




    I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
    – Shredderroy
    Dec 7 at 6:30














  • 1




    I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
    – Shredderroy
    Dec 7 at 6:30








1




1




I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
– Shredderroy
Dec 7 at 6:30




I don't get it. How is the key a getting the value 2? That value does not appear for a in any of the associations. Similarly, why is the value of c not equal to 21 in the maximal result?
– Shredderroy
Dec 7 at 6:30










3 Answers
3






active

oldest

votes

















up vote
11
down vote



accepted










How about



a = {
<|"a" -> 4, "b" -> 9, "c" -> 15|>,
<|"a" -> 21, "b" -> 11, "c" -> 1|>,
<|"a" -> 12, "b" -> 3, "c" -> 21|>
};

Merge[a, Min]

(*<|"a" -> 4, "b" -> 3, "c" -> 1|>*)

Merge[a, Max]

(*<|"a" -> 21, "b" -> 11, "c" -> 21|>*)


EDIT



Improved, as per Kuba's suggestion.






share|improve this answer






























    up vote
    6
    down vote













    Random`Private`MapThreadMin[x]
    Random`Private`MapThreadMax[x]



    <|"a" -> 4, "b" -> 3, "c" -> 1|>



    <|"a" -> 21, "b" -> 11, "c" -> 21|>







    share|improve this answer

















    • 1




      is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
      – Soner
      Dec 7 at 12:33






    • 1




      A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
      – Henrik Schumacher
      Dec 7 at 13:45










    • Thanks, I am checking the link right now :)
      – Soner
      Dec 7 at 21:35


















    up vote
    1
    down vote













    You may use Query and MinMax.



    With x as in OP.



    Query[Transpose /* Map[MinMax]]@x



    <|"a" -> {4, 21}, "b" -> {3, 11}, "c" -> {1, 21}|>



    You can produce a more descriptive result with AssociationThread.



    res = Query[Transpose /* Map[AssociationThread[{"Min", "Max"}, MinMax@#] &]]@x



    <|"a" -> <|"Min" -> 4, "Max" -> 21|>, 
    "b" -> <|"Min" -> 3, "Max" -> 11|>,
    "c" -> <|"Min" -> 1, "Max" -> 21|>|>



    Which you can then access by Key with Association's syntax sugar.



    res["a", "Max"]



    21



    Hope this helps.






    share|improve this answer





















      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',
      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
      });


      }
      });






      Professor Williams is a new contributor. Be nice, and check out our Code of Conduct.










      draft saved

      draft discarded


















      StackExchange.ready(
      function () {
      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmathematica.stackexchange.com%2fquestions%2f187472%2fmin-and-max-of-a-list-of-associations%23new-answer', 'question_page');
      }
      );

      Post as a guest















      Required, but never shown

























      3 Answers
      3






      active

      oldest

      votes








      3 Answers
      3






      active

      oldest

      votes









      active

      oldest

      votes






      active

      oldest

      votes








      up vote
      11
      down vote



      accepted










      How about



      a = {
      <|"a" -> 4, "b" -> 9, "c" -> 15|>,
      <|"a" -> 21, "b" -> 11, "c" -> 1|>,
      <|"a" -> 12, "b" -> 3, "c" -> 21|>
      };

      Merge[a, Min]

      (*<|"a" -> 4, "b" -> 3, "c" -> 1|>*)

      Merge[a, Max]

      (*<|"a" -> 21, "b" -> 11, "c" -> 21|>*)


      EDIT



      Improved, as per Kuba's suggestion.






      share|improve this answer



























        up vote
        11
        down vote



        accepted










        How about



        a = {
        <|"a" -> 4, "b" -> 9, "c" -> 15|>,
        <|"a" -> 21, "b" -> 11, "c" -> 1|>,
        <|"a" -> 12, "b" -> 3, "c" -> 21|>
        };

        Merge[a, Min]

        (*<|"a" -> 4, "b" -> 3, "c" -> 1|>*)

        Merge[a, Max]

        (*<|"a" -> 21, "b" -> 11, "c" -> 21|>*)


        EDIT



        Improved, as per Kuba's suggestion.






        share|improve this answer

























          up vote
          11
          down vote



          accepted







          up vote
          11
          down vote



          accepted






          How about



          a = {
          <|"a" -> 4, "b" -> 9, "c" -> 15|>,
          <|"a" -> 21, "b" -> 11, "c" -> 1|>,
          <|"a" -> 12, "b" -> 3, "c" -> 21|>
          };

          Merge[a, Min]

          (*<|"a" -> 4, "b" -> 3, "c" -> 1|>*)

          Merge[a, Max]

          (*<|"a" -> 21, "b" -> 11, "c" -> 21|>*)


          EDIT



          Improved, as per Kuba's suggestion.






          share|improve this answer














          How about



          a = {
          <|"a" -> 4, "b" -> 9, "c" -> 15|>,
          <|"a" -> 21, "b" -> 11, "c" -> 1|>,
          <|"a" -> 12, "b" -> 3, "c" -> 21|>
          };

          Merge[a, Min]

          (*<|"a" -> 4, "b" -> 3, "c" -> 1|>*)

          Merge[a, Max]

          (*<|"a" -> 21, "b" -> 11, "c" -> 21|>*)


          EDIT



          Improved, as per Kuba's suggestion.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Dec 7 at 8:30

























          answered Dec 7 at 6:22









          Shredderroy

          1,4381115




          1,4381115






















              up vote
              6
              down vote













              Random`Private`MapThreadMin[x]
              Random`Private`MapThreadMax[x]



              <|"a" -> 4, "b" -> 3, "c" -> 1|>



              <|"a" -> 21, "b" -> 11, "c" -> 21|>







              share|improve this answer

















              • 1




                is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
                – Soner
                Dec 7 at 12:33






              • 1




                A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
                – Henrik Schumacher
                Dec 7 at 13:45










              • Thanks, I am checking the link right now :)
                – Soner
                Dec 7 at 21:35















              up vote
              6
              down vote













              Random`Private`MapThreadMin[x]
              Random`Private`MapThreadMax[x]



              <|"a" -> 4, "b" -> 3, "c" -> 1|>



              <|"a" -> 21, "b" -> 11, "c" -> 21|>







              share|improve this answer

















              • 1




                is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
                – Soner
                Dec 7 at 12:33






              • 1




                A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
                – Henrik Schumacher
                Dec 7 at 13:45










              • Thanks, I am checking the link right now :)
                – Soner
                Dec 7 at 21:35













              up vote
              6
              down vote










              up vote
              6
              down vote









              Random`Private`MapThreadMin[x]
              Random`Private`MapThreadMax[x]



              <|"a" -> 4, "b" -> 3, "c" -> 1|>



              <|"a" -> 21, "b" -> 11, "c" -> 21|>







              share|improve this answer












              Random`Private`MapThreadMin[x]
              Random`Private`MapThreadMax[x]



              <|"a" -> 4, "b" -> 3, "c" -> 1|>



              <|"a" -> 21, "b" -> 11, "c" -> 21|>








              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered Dec 7 at 6:34









              Henrik Schumacher

              46.8k466134




              46.8k466134








              • 1




                is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
                – Soner
                Dec 7 at 12:33






              • 1




                A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
                – Henrik Schumacher
                Dec 7 at 13:45










              • Thanks, I am checking the link right now :)
                – Soner
                Dec 7 at 21:35














              • 1




                is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
                – Soner
                Dec 7 at 12:33






              • 1




                A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
                – Henrik Schumacher
                Dec 7 at 13:45










              • Thanks, I am checking the link right now :)
                – Soner
                Dec 7 at 21:35








              1




              1




              is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
              – Soner
              Dec 7 at 12:33




              is there any list out there for these "hidden" commands? Or do you happen to have a favourite list that you can share with us?
              – Soner
              Dec 7 at 12:33




              1




              1




              A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
              – Henrik Schumacher
              Dec 7 at 13:45




              A good try is always ?**` ;) Honestly, I learned this trick very recently from Carl Woll. Some other good place to look for such things is What are some useful undocumented Mathematica functions?
              – Henrik Schumacher
              Dec 7 at 13:45












              Thanks, I am checking the link right now :)
              – Soner
              Dec 7 at 21:35




              Thanks, I am checking the link right now :)
              – Soner
              Dec 7 at 21:35










              up vote
              1
              down vote













              You may use Query and MinMax.



              With x as in OP.



              Query[Transpose /* Map[MinMax]]@x



              <|"a" -> {4, 21}, "b" -> {3, 11}, "c" -> {1, 21}|>



              You can produce a more descriptive result with AssociationThread.



              res = Query[Transpose /* Map[AssociationThread[{"Min", "Max"}, MinMax@#] &]]@x



              <|"a" -> <|"Min" -> 4, "Max" -> 21|>, 
              "b" -> <|"Min" -> 3, "Max" -> 11|>,
              "c" -> <|"Min" -> 1, "Max" -> 21|>|>



              Which you can then access by Key with Association's syntax sugar.



              res["a", "Max"]



              21



              Hope this helps.






              share|improve this answer

























                up vote
                1
                down vote













                You may use Query and MinMax.



                With x as in OP.



                Query[Transpose /* Map[MinMax]]@x



                <|"a" -> {4, 21}, "b" -> {3, 11}, "c" -> {1, 21}|>



                You can produce a more descriptive result with AssociationThread.



                res = Query[Transpose /* Map[AssociationThread[{"Min", "Max"}, MinMax@#] &]]@x



                <|"a" -> <|"Min" -> 4, "Max" -> 21|>, 
                "b" -> <|"Min" -> 3, "Max" -> 11|>,
                "c" -> <|"Min" -> 1, "Max" -> 21|>|>



                Which you can then access by Key with Association's syntax sugar.



                res["a", "Max"]



                21



                Hope this helps.






                share|improve this answer























                  up vote
                  1
                  down vote










                  up vote
                  1
                  down vote









                  You may use Query and MinMax.



                  With x as in OP.



                  Query[Transpose /* Map[MinMax]]@x



                  <|"a" -> {4, 21}, "b" -> {3, 11}, "c" -> {1, 21}|>



                  You can produce a more descriptive result with AssociationThread.



                  res = Query[Transpose /* Map[AssociationThread[{"Min", "Max"}, MinMax@#] &]]@x



                  <|"a" -> <|"Min" -> 4, "Max" -> 21|>, 
                  "b" -> <|"Min" -> 3, "Max" -> 11|>,
                  "c" -> <|"Min" -> 1, "Max" -> 21|>|>



                  Which you can then access by Key with Association's syntax sugar.



                  res["a", "Max"]



                  21



                  Hope this helps.






                  share|improve this answer












                  You may use Query and MinMax.



                  With x as in OP.



                  Query[Transpose /* Map[MinMax]]@x



                  <|"a" -> {4, 21}, "b" -> {3, 11}, "c" -> {1, 21}|>



                  You can produce a more descriptive result with AssociationThread.



                  res = Query[Transpose /* Map[AssociationThread[{"Min", "Max"}, MinMax@#] &]]@x



                  <|"a" -> <|"Min" -> 4, "Max" -> 21|>, 
                  "b" -> <|"Min" -> 3, "Max" -> 11|>,
                  "c" -> <|"Min" -> 1, "Max" -> 21|>|>



                  Which you can then access by Key with Association's syntax sugar.



                  res["a", "Max"]



                  21



                  Hope this helps.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Dec 7 at 10:30









                  Edmund

                  25.2k329100




                  25.2k329100






















                      Professor Williams is a new contributor. Be nice, and check out our Code of Conduct.










                      draft saved

                      draft discarded


















                      Professor Williams is a new contributor. Be nice, and check out our Code of Conduct.













                      Professor Williams is a new contributor. Be nice, and check out our Code of Conduct.












                      Professor Williams is a new contributor. Be nice, and check out our Code of Conduct.
















                      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.





                      Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                      Please pay close attention to the following guidance:


                      • 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.


                      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%2f187472%2fmin-and-max-of-a-list-of-associations%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

                      "Incorrect syntax near the keyword 'ON'. (on update cascade, on delete cascade,)

                      Alcedinidae

                      Origin of the phrase “under your belt”?