Counting users by the type in their profile












2














I'm creating a django and I would like to know how to shorten this code?



I have a model where everyone user has a typeOfPerson (Student, Teacher, Guest ...) and I want to count these types.



@register.simple_tag()
def get_stats_type(choice):
items =
for vote in choice.vote_set.all():
if vote.user not in items:
items.append(vote.user)

types = {}
for user in items:
if user.userprofile.typeOfPerson not in types:
types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()

percent = 0
for type, value in types.items():
percent += value
if percent == 0:
percent = 1

values = {}
for type, value in types.items():
if type not in values:
values[type] = value / percent * 100

return values









share|improve this question









New contributor




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

























    2














    I'm creating a django and I would like to know how to shorten this code?



    I have a model where everyone user has a typeOfPerson (Student, Teacher, Guest ...) and I want to count these types.



    @register.simple_tag()
    def get_stats_type(choice):
    items =
    for vote in choice.vote_set.all():
    if vote.user not in items:
    items.append(vote.user)

    types = {}
    for user in items:
    if user.userprofile.typeOfPerson not in types:
    types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()

    percent = 0
    for type, value in types.items():
    percent += value
    if percent == 0:
    percent = 1

    values = {}
    for type, value in types.items():
    if type not in values:
    values[type] = value / percent * 100

    return values









    share|improve this question









    New contributor




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























      2












      2








      2







      I'm creating a django and I would like to know how to shorten this code?



      I have a model where everyone user has a typeOfPerson (Student, Teacher, Guest ...) and I want to count these types.



      @register.simple_tag()
      def get_stats_type(choice):
      items =
      for vote in choice.vote_set.all():
      if vote.user not in items:
      items.append(vote.user)

      types = {}
      for user in items:
      if user.userprofile.typeOfPerson not in types:
      types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()

      percent = 0
      for type, value in types.items():
      percent += value
      if percent == 0:
      percent = 1

      values = {}
      for type, value in types.items():
      if type not in values:
      values[type] = value / percent * 100

      return values









      share|improve this question









      New contributor




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











      I'm creating a django and I would like to know how to shorten this code?



      I have a model where everyone user has a typeOfPerson (Student, Teacher, Guest ...) and I want to count these types.



      @register.simple_tag()
      def get_stats_type(choice):
      items =
      for vote in choice.vote_set.all():
      if vote.user not in items:
      items.append(vote.user)

      types = {}
      for user in items:
      if user.userprofile.typeOfPerson not in types:
      types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()

      percent = 0
      for type, value in types.items():
      percent += value
      if percent == 0:
      percent = 1

      values = {}
      for type, value in types.items():
      if type not in values:
      values[type] = value / percent * 100

      return values






      python django






      share|improve this question









      New contributor




      Myzel394 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




      Myzel394 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 9 mins ago









      200_success

      128k15150412




      128k15150412






      New contributor




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









      asked 6 hours ago









      Myzel394

      141




      141




      New contributor




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





      New contributor





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






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






















          1 Answer
          1






          active

          oldest

          votes


















          0















          I'm creating a django




          You probably mean that you're creating a web application on top of Django.



          Given this code:



          items = 
          for vote in choice.vote_set.all():
          if vote.user not in items:
          items.append(vote.user)


          you should instead be able to do



          items = set(v.user for v in choice.vote_set.all())


          This achieves the same goal - creating a collection of unique entries. The only catch is that order will not be preserved. If that's important, you'll have to do something more clever.



          This:



          types = {}
          for user in items:
          if user.userprofile.typeOfPerson not in types:
          types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()


          apparently makes an effort to avoid overwriting entries in a dictionary, but I'm not clear on whether that's necessary. If order doesn't matter, and if items all have equal priorities, then you can make this much more simple:



          n_votes = Vote.objects.filter(Choice=choice).count()
          types = {u.userprofile.typeOfPerson: n_votes for u in items}


          This also assumes that Vote.objects.filter(Choice=choice).count() doesn't vary at all over the course of the loop.



          This:



          percent = 0
          for type, value in types.items():
          percent += value
          if percent == 0:
          percent = 1


          can be:



          percent = max(1, sum(types.values()))


          This:



          values = {}
          for type, value in types.items():
          if type not in values:
          values[type] = value / percent * 100


          can probably just be



          values = {t: v/percent * 100 for t, v in types.items()}


          Again, it's not clear why all three of your loops are attempting to be careful in avoiding rewriting values, or what the priority system should be.






          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.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "196"
            };
            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
            });


            }
            });






            Myzel394 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%2fcodereview.stackexchange.com%2fquestions%2f210326%2fcounting-users-by-the-type-in-their-profile%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            0















            I'm creating a django




            You probably mean that you're creating a web application on top of Django.



            Given this code:



            items = 
            for vote in choice.vote_set.all():
            if vote.user not in items:
            items.append(vote.user)


            you should instead be able to do



            items = set(v.user for v in choice.vote_set.all())


            This achieves the same goal - creating a collection of unique entries. The only catch is that order will not be preserved. If that's important, you'll have to do something more clever.



            This:



            types = {}
            for user in items:
            if user.userprofile.typeOfPerson not in types:
            types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()


            apparently makes an effort to avoid overwriting entries in a dictionary, but I'm not clear on whether that's necessary. If order doesn't matter, and if items all have equal priorities, then you can make this much more simple:



            n_votes = Vote.objects.filter(Choice=choice).count()
            types = {u.userprofile.typeOfPerson: n_votes for u in items}


            This also assumes that Vote.objects.filter(Choice=choice).count() doesn't vary at all over the course of the loop.



            This:



            percent = 0
            for type, value in types.items():
            percent += value
            if percent == 0:
            percent = 1


            can be:



            percent = max(1, sum(types.values()))


            This:



            values = {}
            for type, value in types.items():
            if type not in values:
            values[type] = value / percent * 100


            can probably just be



            values = {t: v/percent * 100 for t, v in types.items()}


            Again, it's not clear why all three of your loops are attempting to be careful in avoiding rewriting values, or what the priority system should be.






            share|improve this answer


























              0















              I'm creating a django




              You probably mean that you're creating a web application on top of Django.



              Given this code:



              items = 
              for vote in choice.vote_set.all():
              if vote.user not in items:
              items.append(vote.user)


              you should instead be able to do



              items = set(v.user for v in choice.vote_set.all())


              This achieves the same goal - creating a collection of unique entries. The only catch is that order will not be preserved. If that's important, you'll have to do something more clever.



              This:



              types = {}
              for user in items:
              if user.userprofile.typeOfPerson not in types:
              types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()


              apparently makes an effort to avoid overwriting entries in a dictionary, but I'm not clear on whether that's necessary. If order doesn't matter, and if items all have equal priorities, then you can make this much more simple:



              n_votes = Vote.objects.filter(Choice=choice).count()
              types = {u.userprofile.typeOfPerson: n_votes for u in items}


              This also assumes that Vote.objects.filter(Choice=choice).count() doesn't vary at all over the course of the loop.



              This:



              percent = 0
              for type, value in types.items():
              percent += value
              if percent == 0:
              percent = 1


              can be:



              percent = max(1, sum(types.values()))


              This:



              values = {}
              for type, value in types.items():
              if type not in values:
              values[type] = value / percent * 100


              can probably just be



              values = {t: v/percent * 100 for t, v in types.items()}


              Again, it's not clear why all three of your loops are attempting to be careful in avoiding rewriting values, or what the priority system should be.






              share|improve this answer
























                0












                0








                0







                I'm creating a django




                You probably mean that you're creating a web application on top of Django.



                Given this code:



                items = 
                for vote in choice.vote_set.all():
                if vote.user not in items:
                items.append(vote.user)


                you should instead be able to do



                items = set(v.user for v in choice.vote_set.all())


                This achieves the same goal - creating a collection of unique entries. The only catch is that order will not be preserved. If that's important, you'll have to do something more clever.



                This:



                types = {}
                for user in items:
                if user.userprofile.typeOfPerson not in types:
                types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()


                apparently makes an effort to avoid overwriting entries in a dictionary, but I'm not clear on whether that's necessary. If order doesn't matter, and if items all have equal priorities, then you can make this much more simple:



                n_votes = Vote.objects.filter(Choice=choice).count()
                types = {u.userprofile.typeOfPerson: n_votes for u in items}


                This also assumes that Vote.objects.filter(Choice=choice).count() doesn't vary at all over the course of the loop.



                This:



                percent = 0
                for type, value in types.items():
                percent += value
                if percent == 0:
                percent = 1


                can be:



                percent = max(1, sum(types.values()))


                This:



                values = {}
                for type, value in types.items():
                if type not in values:
                values[type] = value / percent * 100


                can probably just be



                values = {t: v/percent * 100 for t, v in types.items()}


                Again, it's not clear why all three of your loops are attempting to be careful in avoiding rewriting values, or what the priority system should be.






                share|improve this answer













                I'm creating a django




                You probably mean that you're creating a web application on top of Django.



                Given this code:



                items = 
                for vote in choice.vote_set.all():
                if vote.user not in items:
                items.append(vote.user)


                you should instead be able to do



                items = set(v.user for v in choice.vote_set.all())


                This achieves the same goal - creating a collection of unique entries. The only catch is that order will not be preserved. If that's important, you'll have to do something more clever.



                This:



                types = {}
                for user in items:
                if user.userprofile.typeOfPerson not in types:
                types[user.userprofile.typeOfPerson] = Vote.objects.filter(Choice=choice).count()


                apparently makes an effort to avoid overwriting entries in a dictionary, but I'm not clear on whether that's necessary. If order doesn't matter, and if items all have equal priorities, then you can make this much more simple:



                n_votes = Vote.objects.filter(Choice=choice).count()
                types = {u.userprofile.typeOfPerson: n_votes for u in items}


                This also assumes that Vote.objects.filter(Choice=choice).count() doesn't vary at all over the course of the loop.



                This:



                percent = 0
                for type, value in types.items():
                percent += value
                if percent == 0:
                percent = 1


                can be:



                percent = max(1, sum(types.values()))


                This:



                values = {}
                for type, value in types.items():
                if type not in values:
                values[type] = value / percent * 100


                can probably just be



                values = {t: v/percent * 100 for t, v in types.items()}


                Again, it's not clear why all three of your loops are attempting to be careful in avoiding rewriting values, or what the priority system should be.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered 5 hours ago









                Reinderien

                2,684619




                2,684619






















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










                    draft saved

                    draft discarded


















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













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












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
















                    Thanks for contributing an answer to Code Review 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%2fcodereview.stackexchange.com%2fquestions%2f210326%2fcounting-users-by-the-type-in-their-profile%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

                    Costa Masnaga

                    Fotorealismo

                    Sidney Franklin