Force elements at beginning and end of list












6














How can I modify this list so that all p's appear at the beginning, the q's at the end, and the values in between are sorted alphabetically?



l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']


So I would like to have:



['p','p','a','b','c','d','f','g','n','t','z','q','q']









share|improve this question







New contributor




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
















  • 6




    What have you tried that didn't work ?
    – bruno desthuilliers
    9 hours ago










  • Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
    – Gerald
    9 hours ago


















6














How can I modify this list so that all p's appear at the beginning, the q's at the end, and the values in between are sorted alphabetically?



l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']


So I would like to have:



['p','p','a','b','c','d','f','g','n','t','z','q','q']









share|improve this question







New contributor




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
















  • 6




    What have you tried that didn't work ?
    – bruno desthuilliers
    9 hours ago










  • Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
    – Gerald
    9 hours ago
















6












6








6







How can I modify this list so that all p's appear at the beginning, the q's at the end, and the values in between are sorted alphabetically?



l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']


So I would like to have:



['p','p','a','b','c','d','f','g','n','t','z','q','q']









share|improve this question







New contributor




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











How can I modify this list so that all p's appear at the beginning, the q's at the end, and the values in between are sorted alphabetically?



l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']


So I would like to have:



['p','p','a','b','c','d','f','g','n','t','z','q','q']






python list sorting






share|improve this question







New contributor




Gerald 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




Gerald 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






New contributor




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









asked 9 hours ago









Gerald

453




453




New contributor




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





New contributor





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






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








  • 6




    What have you tried that didn't work ?
    – bruno desthuilliers
    9 hours ago










  • Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
    – Gerald
    9 hours ago
















  • 6




    What have you tried that didn't work ?
    – bruno desthuilliers
    9 hours ago










  • Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
    – Gerald
    9 hours ago










6




6




What have you tried that didn't work ?
– bruno desthuilliers
9 hours ago




What have you tried that didn't work ?
– bruno desthuilliers
9 hours ago












Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
– Gerald
9 hours ago






Well I though of somehow sorting those items that anen't in ['p','q'], and then adding as many p and q as I found at the beginning and end. But thought that it could be done in a much easier way as it is clear now
– Gerald
9 hours ago














6 Answers
6






active

oldest

votes


















13














You can use sorted with the following key:



sorted(l, key = lambda s: (s!='p', s=='q', s))
['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']




Explanation



To get a better idea of how this is working, the following list comprehension aims to replicate what is being returned from the lambda function called in key prior to making comparisons:



t = [(s!='p', s=='q', s) for s in pl]

print(t)
[(True, False, 'f'),
(True, False, 'g'),
(False, False, 'p'),
(True, False, 'a'),
(False, False, 'p'),
(True, False, 'c'),
(True, False, 'b'),
(True, True, 'q'),
(True, False, 'z'),
(True, False, 'n'),
(True, False, 'd'),
(True, False, 't'),
(True, True, 'q')]


So taking into account that False = 0 and True = 1, when this modified list of tuples is sorted the result is:



sorted(t)
[(False, False, 'p'),
(False, False, 'p'),
(True, False, 'a'),
(True, False, 'b'),
(True, False, 'c'),
(True, False, 'd'),
(True, False, 'f'),
(True, False, 'g'),
(True, False, 'n'),
(True, False, 't'),
(True, False, 'z'),
(True, True, 'q'),
(True, True, 'q')]





share|improve this answer



















  • 1




    Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
    – Scott Boston
    9 hours ago








  • 1




    @ScottBoston no, it returns a (bool, bool, str) tuple
    – juanpa.arrivillaga
    9 hours ago






  • 2




    So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
    – yatu
    9 hours ago






  • 1




    @nixon Ah!!! The light bulb just turned on. Great!
    – Scott Boston
    9 hours ago








  • 1




    For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
    – Scott Boston
    9 hours ago



















6














One idea is to use a priority dictionary with a custom function. This is naturally extendable should you wish to include additional criteria.



L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

def sort_func(x):
priority = {'p': 0, 'q': 2}
return priority.get(x, 1), x

res = sorted(L, key=sort_func)

print(res)

['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





share|improve this answer





























    5














    Use the key parameter in sorted:



    l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

    def key(c):
    if c == 'q':
    return (2, c)
    elif c == 'p':
    return (0, c)
    return (1, c)


    result = sorted(l, key=key)
    print(result)


    Output



    ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





    share|improve this answer





























      3














      You can find all p and q elements, filter the original list, and then sort:



      l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
      _ps, _qs = [i for i in l if i == 'p'], [i for i in l if i == 'q']
      new_l = _ps+sorted(filter(lambda x:x not in {'q', 'p'}, l))+_qs


      Output:



      ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





      share|improve this answer





















      • If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
        – pault
        9 hours ago





















      2














      Just define an appropriate key function:



      >>> def _key(x):
      ... if x == 'p':
      ... return -1
      ... elif x == 'q':
      ... return float('inf')
      ... else:
      ... return ord(x)
      ...
      >>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
      >>> sorted(l, key=_key)
      ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']


      Note, every character is mapped to an integer >= 0, so we can just rely on ord, and since -1 will always be less than anything returned by ord, we can use that for p, and for q, we can use infinity, so it will be alway greater than something returned by ord.






      share|improve this answer































        0














        You could also store you front, middle and ends in a collections.defaultdict(), the just add all three lists at the end:



        from collections import defaultdict

        l = ["f", "g", "p", "a", "p", "c", "b", "q", "z", "n", "d", "t", "q"]

        keys = {"p": "front", "q": "end"}

        d = defaultdict(list)
        for item in l:
        d[keys.get(item, "middle")].append(item)

        print(d["front"] + sorted(d["middle"]) + d["end"])
        # ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





        share|improve this answer





















          Your Answer






          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: "1"
          };
          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: true,
          noModals: true,
          showLowRepImageUploadWarning: true,
          reputationToPostImages: 10,
          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
          });


          }
          });






          Gerald 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%2fstackoverflow.com%2fquestions%2f53947928%2fforce-elements-at-beginning-and-end-of-list%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          6 Answers
          6






          active

          oldest

          votes








          6 Answers
          6






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes









          13














          You can use sorted with the following key:



          sorted(l, key = lambda s: (s!='p', s=='q', s))
          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']




          Explanation



          To get a better idea of how this is working, the following list comprehension aims to replicate what is being returned from the lambda function called in key prior to making comparisons:



          t = [(s!='p', s=='q', s) for s in pl]

          print(t)
          [(True, False, 'f'),
          (True, False, 'g'),
          (False, False, 'p'),
          (True, False, 'a'),
          (False, False, 'p'),
          (True, False, 'c'),
          (True, False, 'b'),
          (True, True, 'q'),
          (True, False, 'z'),
          (True, False, 'n'),
          (True, False, 'd'),
          (True, False, 't'),
          (True, True, 'q')]


          So taking into account that False = 0 and True = 1, when this modified list of tuples is sorted the result is:



          sorted(t)
          [(False, False, 'p'),
          (False, False, 'p'),
          (True, False, 'a'),
          (True, False, 'b'),
          (True, False, 'c'),
          (True, False, 'd'),
          (True, False, 'f'),
          (True, False, 'g'),
          (True, False, 'n'),
          (True, False, 't'),
          (True, False, 'z'),
          (True, True, 'q'),
          (True, True, 'q')]





          share|improve this answer



















          • 1




            Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
            – Scott Boston
            9 hours ago








          • 1




            @ScottBoston no, it returns a (bool, bool, str) tuple
            – juanpa.arrivillaga
            9 hours ago






          • 2




            So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
            – yatu
            9 hours ago






          • 1




            @nixon Ah!!! The light bulb just turned on. Great!
            – Scott Boston
            9 hours ago








          • 1




            For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
            – Scott Boston
            9 hours ago
















          13














          You can use sorted with the following key:



          sorted(l, key = lambda s: (s!='p', s=='q', s))
          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']




          Explanation



          To get a better idea of how this is working, the following list comprehension aims to replicate what is being returned from the lambda function called in key prior to making comparisons:



          t = [(s!='p', s=='q', s) for s in pl]

          print(t)
          [(True, False, 'f'),
          (True, False, 'g'),
          (False, False, 'p'),
          (True, False, 'a'),
          (False, False, 'p'),
          (True, False, 'c'),
          (True, False, 'b'),
          (True, True, 'q'),
          (True, False, 'z'),
          (True, False, 'n'),
          (True, False, 'd'),
          (True, False, 't'),
          (True, True, 'q')]


          So taking into account that False = 0 and True = 1, when this modified list of tuples is sorted the result is:



          sorted(t)
          [(False, False, 'p'),
          (False, False, 'p'),
          (True, False, 'a'),
          (True, False, 'b'),
          (True, False, 'c'),
          (True, False, 'd'),
          (True, False, 'f'),
          (True, False, 'g'),
          (True, False, 'n'),
          (True, False, 't'),
          (True, False, 'z'),
          (True, True, 'q'),
          (True, True, 'q')]





          share|improve this answer



















          • 1




            Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
            – Scott Boston
            9 hours ago








          • 1




            @ScottBoston no, it returns a (bool, bool, str) tuple
            – juanpa.arrivillaga
            9 hours ago






          • 2




            So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
            – yatu
            9 hours ago






          • 1




            @nixon Ah!!! The light bulb just turned on. Great!
            – Scott Boston
            9 hours ago








          • 1




            For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
            – Scott Boston
            9 hours ago














          13












          13








          13






          You can use sorted with the following key:



          sorted(l, key = lambda s: (s!='p', s=='q', s))
          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']




          Explanation



          To get a better idea of how this is working, the following list comprehension aims to replicate what is being returned from the lambda function called in key prior to making comparisons:



          t = [(s!='p', s=='q', s) for s in pl]

          print(t)
          [(True, False, 'f'),
          (True, False, 'g'),
          (False, False, 'p'),
          (True, False, 'a'),
          (False, False, 'p'),
          (True, False, 'c'),
          (True, False, 'b'),
          (True, True, 'q'),
          (True, False, 'z'),
          (True, False, 'n'),
          (True, False, 'd'),
          (True, False, 't'),
          (True, True, 'q')]


          So taking into account that False = 0 and True = 1, when this modified list of tuples is sorted the result is:



          sorted(t)
          [(False, False, 'p'),
          (False, False, 'p'),
          (True, False, 'a'),
          (True, False, 'b'),
          (True, False, 'c'),
          (True, False, 'd'),
          (True, False, 'f'),
          (True, False, 'g'),
          (True, False, 'n'),
          (True, False, 't'),
          (True, False, 'z'),
          (True, True, 'q'),
          (True, True, 'q')]





          share|improve this answer














          You can use sorted with the following key:



          sorted(l, key = lambda s: (s!='p', s=='q', s))
          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']




          Explanation



          To get a better idea of how this is working, the following list comprehension aims to replicate what is being returned from the lambda function called in key prior to making comparisons:



          t = [(s!='p', s=='q', s) for s in pl]

          print(t)
          [(True, False, 'f'),
          (True, False, 'g'),
          (False, False, 'p'),
          (True, False, 'a'),
          (False, False, 'p'),
          (True, False, 'c'),
          (True, False, 'b'),
          (True, True, 'q'),
          (True, False, 'z'),
          (True, False, 'n'),
          (True, False, 'd'),
          (True, False, 't'),
          (True, True, 'q')]


          So taking into account that False = 0 and True = 1, when this modified list of tuples is sorted the result is:



          sorted(t)
          [(False, False, 'p'),
          (False, False, 'p'),
          (True, False, 'a'),
          (True, False, 'b'),
          (True, False, 'c'),
          (True, False, 'd'),
          (True, False, 'f'),
          (True, False, 'g'),
          (True, False, 'n'),
          (True, False, 't'),
          (True, False, 'z'),
          (True, True, 'q'),
          (True, True, 'q')]






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 9 hours ago

























          answered 9 hours ago









          yatu

          3,9221223




          3,9221223








          • 1




            Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
            – Scott Boston
            9 hours ago








          • 1




            @ScottBoston no, it returns a (bool, bool, str) tuple
            – juanpa.arrivillaga
            9 hours ago






          • 2




            So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
            – yatu
            9 hours ago






          • 1




            @nixon Ah!!! The light bulb just turned on. Great!
            – Scott Boston
            9 hours ago








          • 1




            For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
            – Scott Boston
            9 hours ago














          • 1




            Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
            – Scott Boston
            9 hours ago








          • 1




            @ScottBoston no, it returns a (bool, bool, str) tuple
            – juanpa.arrivillaga
            9 hours ago






          • 2




            So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
            – yatu
            9 hours ago






          • 1




            @nixon Ah!!! The light bulb just turned on. Great!
            – Scott Boston
            9 hours ago








          • 1




            For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
            – Scott Boston
            9 hours ago








          1




          1




          Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
          – Scott Boston
          9 hours ago






          Now, this is pretty cool. Can you explain a bit? sorted sorts True < characters < False?
          – Scott Boston
          9 hours ago






          1




          1




          @ScottBoston no, it returns a (bool, bool, str) tuple
          – juanpa.arrivillaga
          9 hours ago




          @ScottBoston no, it returns a (bool, bool, str) tuple
          – juanpa.arrivillaga
          9 hours ago




          2




          2




          So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
          – yatu
          9 hours ago




          So (False, False) comes first and (True,True) in the end. In between there will be (True,False)
          – yatu
          9 hours ago




          1




          1




          @nixon Ah!!! The light bulb just turned on. Great!
          – Scott Boston
          9 hours ago






          @nixon Ah!!! The light bulb just turned on. Great!
          – Scott Boston
          9 hours ago






          1




          1




          For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
          – Scott Boston
          9 hours ago




          For those of you who need this sorted([(s!='p', s=='q', s) for s in l]) is a great visual of what is going on.
          – Scott Boston
          9 hours ago













          6














          One idea is to use a priority dictionary with a custom function. This is naturally extendable should you wish to include additional criteria.



          L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

          def sort_func(x):
          priority = {'p': 0, 'q': 2}
          return priority.get(x, 1), x

          res = sorted(L, key=sort_func)

          print(res)

          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





          share|improve this answer


























            6














            One idea is to use a priority dictionary with a custom function. This is naturally extendable should you wish to include additional criteria.



            L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

            def sort_func(x):
            priority = {'p': 0, 'q': 2}
            return priority.get(x, 1), x

            res = sorted(L, key=sort_func)

            print(res)

            ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





            share|improve this answer
























              6












              6








              6






              One idea is to use a priority dictionary with a custom function. This is naturally extendable should you wish to include additional criteria.



              L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

              def sort_func(x):
              priority = {'p': 0, 'q': 2}
              return priority.get(x, 1), x

              res = sorted(L, key=sort_func)

              print(res)

              ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





              share|improve this answer












              One idea is to use a priority dictionary with a custom function. This is naturally extendable should you wish to include additional criteria.



              L = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

              def sort_func(x):
              priority = {'p': 0, 'q': 2}
              return priority.get(x, 1), x

              res = sorted(L, key=sort_func)

              print(res)

              ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']






              share|improve this answer












              share|improve this answer



              share|improve this answer










              answered 9 hours ago









              jpp

              90.7k2052101




              90.7k2052101























                  5














                  Use the key parameter in sorted:



                  l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

                  def key(c):
                  if c == 'q':
                  return (2, c)
                  elif c == 'p':
                  return (0, c)
                  return (1, c)


                  result = sorted(l, key=key)
                  print(result)


                  Output



                  ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                  share|improve this answer


























                    5














                    Use the key parameter in sorted:



                    l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

                    def key(c):
                    if c == 'q':
                    return (2, c)
                    elif c == 'p':
                    return (0, c)
                    return (1, c)


                    result = sorted(l, key=key)
                    print(result)


                    Output



                    ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                    share|improve this answer
























                      5












                      5








                      5






                      Use the key parameter in sorted:



                      l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

                      def key(c):
                      if c == 'q':
                      return (2, c)
                      elif c == 'p':
                      return (0, c)
                      return (1, c)


                      result = sorted(l, key=key)
                      print(result)


                      Output



                      ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                      share|improve this answer












                      Use the key parameter in sorted:



                      l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']

                      def key(c):
                      if c == 'q':
                      return (2, c)
                      elif c == 'p':
                      return (0, c)
                      return (1, c)


                      result = sorted(l, key=key)
                      print(result)


                      Output



                      ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']






                      share|improve this answer












                      share|improve this answer



                      share|improve this answer










                      answered 9 hours ago









                      Daniel Mesejo

                      12.7k11024




                      12.7k11024























                          3














                          You can find all p and q elements, filter the original list, and then sort:



                          l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                          _ps, _qs = [i for i in l if i == 'p'], [i for i in l if i == 'q']
                          new_l = _ps+sorted(filter(lambda x:x not in {'q', 'p'}, l))+_qs


                          Output:



                          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                          share|improve this answer





















                          • If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                            – pault
                            9 hours ago


















                          3














                          You can find all p and q elements, filter the original list, and then sort:



                          l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                          _ps, _qs = [i for i in l if i == 'p'], [i for i in l if i == 'q']
                          new_l = _ps+sorted(filter(lambda x:x not in {'q', 'p'}, l))+_qs


                          Output:



                          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                          share|improve this answer





















                          • If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                            – pault
                            9 hours ago
















                          3












                          3








                          3






                          You can find all p and q elements, filter the original list, and then sort:



                          l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                          _ps, _qs = [i for i in l if i == 'p'], [i for i in l if i == 'q']
                          new_l = _ps+sorted(filter(lambda x:x not in {'q', 'p'}, l))+_qs


                          Output:



                          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                          share|improve this answer












                          You can find all p and q elements, filter the original list, and then sort:



                          l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                          _ps, _qs = [i for i in l if i == 'p'], [i for i in l if i == 'q']
                          new_l = _ps+sorted(filter(lambda x:x not in {'q', 'p'}, l))+_qs


                          Output:



                          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered 9 hours ago









                          Ajax1234

                          39.9k42652




                          39.9k42652












                          • If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                            – pault
                            9 hours ago




















                          • If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                            – pault
                            9 hours ago


















                          If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                          – pault
                          9 hours ago






                          If you're going to do it this way, you can also just count the ps and qs: ['p']*l.count('p') + sorted(filter({'q', 'p'}.isdisjoint, l)) + ['q']*l.count('q') which is the same time complexity. Edit: You can get rid of the lambda too.
                          – pault
                          9 hours ago













                          2














                          Just define an appropriate key function:



                          >>> def _key(x):
                          ... if x == 'p':
                          ... return -1
                          ... elif x == 'q':
                          ... return float('inf')
                          ... else:
                          ... return ord(x)
                          ...
                          >>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                          >>> sorted(l, key=_key)
                          ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']


                          Note, every character is mapped to an integer >= 0, so we can just rely on ord, and since -1 will always be less than anything returned by ord, we can use that for p, and for q, we can use infinity, so it will be alway greater than something returned by ord.






                          share|improve this answer




























                            2














                            Just define an appropriate key function:



                            >>> def _key(x):
                            ... if x == 'p':
                            ... return -1
                            ... elif x == 'q':
                            ... return float('inf')
                            ... else:
                            ... return ord(x)
                            ...
                            >>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                            >>> sorted(l, key=_key)
                            ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']


                            Note, every character is mapped to an integer >= 0, so we can just rely on ord, and since -1 will always be less than anything returned by ord, we can use that for p, and for q, we can use infinity, so it will be alway greater than something returned by ord.






                            share|improve this answer


























                              2












                              2








                              2






                              Just define an appropriate key function:



                              >>> def _key(x):
                              ... if x == 'p':
                              ... return -1
                              ... elif x == 'q':
                              ... return float('inf')
                              ... else:
                              ... return ord(x)
                              ...
                              >>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                              >>> sorted(l, key=_key)
                              ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']


                              Note, every character is mapped to an integer >= 0, so we can just rely on ord, and since -1 will always be less than anything returned by ord, we can use that for p, and for q, we can use infinity, so it will be alway greater than something returned by ord.






                              share|improve this answer














                              Just define an appropriate key function:



                              >>> def _key(x):
                              ... if x == 'p':
                              ... return -1
                              ... elif x == 'q':
                              ... return float('inf')
                              ... else:
                              ... return ord(x)
                              ...
                              >>> l = ['f','g','p','a','p','c','b','q','z','n','d','t','q']
                              >>> sorted(l, key=_key)
                              ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']


                              Note, every character is mapped to an integer >= 0, so we can just rely on ord, and since -1 will always be less than anything returned by ord, we can use that for p, and for q, we can use infinity, so it will be alway greater than something returned by ord.







                              share|improve this answer














                              share|improve this answer



                              share|improve this answer








                              edited 9 hours ago

























                              answered 9 hours ago









                              juanpa.arrivillaga

                              37k33470




                              37k33470























                                  0














                                  You could also store you front, middle and ends in a collections.defaultdict(), the just add all three lists at the end:



                                  from collections import defaultdict

                                  l = ["f", "g", "p", "a", "p", "c", "b", "q", "z", "n", "d", "t", "q"]

                                  keys = {"p": "front", "q": "end"}

                                  d = defaultdict(list)
                                  for item in l:
                                  d[keys.get(item, "middle")].append(item)

                                  print(d["front"] + sorted(d["middle"]) + d["end"])
                                  # ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                                  share|improve this answer


























                                    0














                                    You could also store you front, middle and ends in a collections.defaultdict(), the just add all three lists at the end:



                                    from collections import defaultdict

                                    l = ["f", "g", "p", "a", "p", "c", "b", "q", "z", "n", "d", "t", "q"]

                                    keys = {"p": "front", "q": "end"}

                                    d = defaultdict(list)
                                    for item in l:
                                    d[keys.get(item, "middle")].append(item)

                                    print(d["front"] + sorted(d["middle"]) + d["end"])
                                    # ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                                    share|improve this answer
























                                      0












                                      0








                                      0






                                      You could also store you front, middle and ends in a collections.defaultdict(), the just add all three lists at the end:



                                      from collections import defaultdict

                                      l = ["f", "g", "p", "a", "p", "c", "b", "q", "z", "n", "d", "t", "q"]

                                      keys = {"p": "front", "q": "end"}

                                      d = defaultdict(list)
                                      for item in l:
                                      d[keys.get(item, "middle")].append(item)

                                      print(d["front"] + sorted(d["middle"]) + d["end"])
                                      # ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']





                                      share|improve this answer












                                      You could also store you front, middle and ends in a collections.defaultdict(), the just add all three lists at the end:



                                      from collections import defaultdict

                                      l = ["f", "g", "p", "a", "p", "c", "b", "q", "z", "n", "d", "t", "q"]

                                      keys = {"p": "front", "q": "end"}

                                      d = defaultdict(list)
                                      for item in l:
                                      d[keys.get(item, "middle")].append(item)

                                      print(d["front"] + sorted(d["middle"]) + d["end"])
                                      # ['p', 'p', 'a', 'b', 'c', 'd', 'f', 'g', 'n', 't', 'z', 'q', 'q']






                                      share|improve this answer












                                      share|improve this answer



                                      share|improve this answer










                                      answered 9 hours ago









                                      RoadRunner

                                      10.2k31340




                                      10.2k31340






















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










                                          draft saved

                                          draft discarded


















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













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












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
















                                          Thanks for contributing an answer to Stack Overflow!


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





                                          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%2fstackoverflow.com%2fquestions%2f53947928%2fforce-elements-at-beginning-and-end-of-list%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

                                          Plaza Victoria

                                          In PowerPoint, is there a keyboard shortcut for bulleted / numbered list?

                                          How to put 3 figures in Latex with 2 figures side by side and 1 below these side by side images but in...