Posts: 13
Threads: 7
Joined: Jan 2018
I am trying to understand how to sort an array in Python 3.x using the bulit in sort function. So I wrote the following code. However, it did does not work.
1 2 |
a = [ 1 , - 2 , 3 , - 4 , 5 , - 6 ]
sorted (a, cmp = numeric_compare )
|
where numeric_compare is defined as follows:
1 2 |
def numeric_compare(x, y):
return abs (x) - abs (y)
|
What I want to do is sort the array by the absolute values of the numbers. I realize, in this case the array is already sorted in that order.
Bob
Posts: 8,159
Threads: 160
Joined: Sep 2016
Jan-28-2018, 04:10 PM
(This post was last modified: Jan-28-2018, 04:10 PM by buran.)
you need to understand the difference between sorted() function and sort() method, e.g. list.sort() method
sorted() built-in function takes iterable and will return it sorted, i.e. you need to assign what it returns to a variable in order to use it later. it can be the same, e.g.
1 2 3 4 |
>>> a = [ 3 , 1 , 4 , 2 ]
>>> a = sorted (a)
>>> a
[ 1 , 2 , 3 , 4 ]
|
one possible use is to itreate over sorted iterable, without changing the original one
1 2 3 4 5 6 7 8 9 10 |
>>> a = [ 3 , 4 , 1 , 2 ]
>>> for item in sorted (a):
... print (item)
...
1
2
3
4
>>> a
[ 3 , 4 , 1 , 2 ]
|
while sort() method will sort the iterable in place, e.g.
1 2 3 4 |
>>> a = [ 3 , 1 , 4 , 2 ]
>>> a.sort()
>>> a
[ 1 , 2 , 3 , 4 ]
|
Posts: 13
Threads: 7
Joined: Jan 2018
Thank you for the response. However, your code sorts based upon the number, not the absolute value of the number. Is there a way for me to pass a comparison function to the sort (or sorted) in Python?
Thanks,
Bob
Posts: 1,150
Threads: 42
Joined: Sep 2016
Jan-28-2018, 04:54 PM
(This post was last modified: Jan-28-2018, 04:54 PM by j.crater.)
You can with specifying the key argument:
1 2 3 4 |
import math
a = [ 0 , 1 , - 3 , - 5 , 6 , 21 , - 34 , 43 , - 45 , 65 , - 68 ]
sorted (a, key = math.fabs)
|
Output: [0, 1, -3, -5, 6, 21, -34, 43, -45, 65, -68]
There is also reverse=True option if you want to change the order.
Posts: 8,159
Threads: 160
Joined: Sep 2016
1 2 3 4 |
>>> a = [ - 2 , - 1 , 0 , 1 , 2 ]
>>> a.sort(key = abs )
>>> a
[ 0 , - 1 , 1 , - 2 , 2 ]
|
Posts: 13
Threads: 7
Joined: Jan 2018
j.crater and buran,
Thanks for the response. Your solution works and you taught me something but is there a way to specify the comparison function that sort function uses. For example, if I wanted all prime numbers to come out a head of all composite numbers, is there a way to do that? Is the solution to write my own sort function?
Thanks,
Bob
Posts: 8,159
Threads: 160
Joined: Sep 2016
|