Force elements at beginning and end of list
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
New contributor
add a comment |
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
New contributor
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 manyp
andq
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
add a comment |
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
New contributor
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
python list sorting
New contributor
New contributor
New contributor
asked 9 hours ago
Gerald
453
453
New contributor
New contributor
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 manyp
andq
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
add a comment |
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 manyp
andq
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
add a comment |
6 Answers
6
active
oldest
votes
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')]
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 thissorted([(s!='p', s=='q', s) for s in l])
is a great visual of what is going on.
– Scott Boston
9 hours ago
|
show 1 more comment
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']
add a comment |
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']
add a comment |
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']
If you're going to do it this way, you can also just count thep
s andq
s:['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 thelambda
too.
– pault
9 hours ago
add a comment |
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
.
add a comment |
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']
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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')]
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 thissorted([(s!='p', s=='q', s) for s in l])
is a great visual of what is going on.
– Scott Boston
9 hours ago
|
show 1 more comment
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')]
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 thissorted([(s!='p', s=='q', s) for s in l])
is a great visual of what is going on.
– Scott Boston
9 hours ago
|
show 1 more comment
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')]
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')]
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 thissorted([(s!='p', s=='q', s) for s in l])
is a great visual of what is going on.
– Scott Boston
9 hours ago
|
show 1 more comment
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 thissorted([(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
|
show 1 more comment
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']
add a comment |
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']
add a comment |
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']
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']
answered 9 hours ago
jpp
90.7k2052101
90.7k2052101
add a comment |
add a comment |
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']
add a comment |
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']
add a comment |
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']
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']
answered 9 hours ago
Daniel Mesejo
12.7k11024
12.7k11024
add a comment |
add a comment |
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']
If you're going to do it this way, you can also just count thep
s andq
s:['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 thelambda
too.
– pault
9 hours ago
add a comment |
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']
If you're going to do it this way, you can also just count thep
s andq
s:['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 thelambda
too.
– pault
9 hours ago
add a comment |
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']
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']
answered 9 hours ago
Ajax1234
39.9k42652
39.9k42652
If you're going to do it this way, you can also just count thep
s andq
s:['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 thelambda
too.
– pault
9 hours ago
add a comment |
If you're going to do it this way, you can also just count thep
s andq
s:['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 thelambda
too.
– pault
9 hours ago
If you're going to do it this way, you can also just count the
p
s and q
s: ['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
p
s and q
s: ['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
add a comment |
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
.
add a comment |
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
.
add a comment |
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
.
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
.
edited 9 hours ago
answered 9 hours ago
juanpa.arrivillaga
37k33470
37k33470
add a comment |
add a comment |
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']
add a comment |
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']
add a comment |
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']
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']
answered 9 hours ago
RoadRunner
10.2k31340
10.2k31340
add a comment |
add a comment |
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.
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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 manyp
andq
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