# How To Sort A Set Of Values?

Summary: This blog explores the steps to sort elements of a Set.

Python offers the built-in `sorted()` function to sort elements in container objects such as a set or a list. For example: `sorted({1, 5, 2})` sorts the elements in the set and returns the sorted list `[1, 2, 5]`.

Note: All the solutions provided below have been verified using Python 3.9.0b5

## Problem Formulation

Imagine that one has the following Set in Python.

`set(['4.928857000', '0.030778000', '4.927327899', '0.002949589', '0.023685000', '11.463524000', '0.0270662958'])`

## Desired Output:

How does one sort this Set, so that the output is the following List.

`['0.002949589', '0.023685000', '0.0270662958', '0.030778000', '4.927327899', '4.928857000', '11.463524000']`

## Background

Wikipedia: “In computer science, a Set is an abstract data type that can store unique values, without any particular order.”

Python defines a Set as an unordered collection with no duplicate elements. In Python, a Set is a built-in data-type that stores collections of data.  Think of a Set as container type, similar to lists, tuples and dictionaries. Python programmers use sets to test for membership and to remove duplicate items.

## How to Sort a Set?

Since 2013, the Python Community has asked the question about sorting a Set, about 260k times. That is incredible, given the above background of a Set.

So first things first! In Python, Elements in a given Set, do not have any specific order. One can iterate thru each element in a Set and sort the resulting output. Python offers the built-in sorted() function to sort elements in container objects such as a Set or a List. The following code examples show how to use the `sorted()` function.

```\$ python
Python 3.9.0b5 (default, Oct 19 2020, 11:11:59)
>>>
>>> ## This is the original Set Object whose elements will be sorted.
>>> my_set = set(['4.928857000', '0.030778000', '4.927327899', '0.002949589', '0.023685000', '11.463524000', '0.0270662958'])
>>>
>>> ## This is the type of my_set.  Yes, Python confirms, it is a set!!
>>> type(my_set)
<class 'set'>
>>>
>>> ## The Python Built-in function “sorted()” iterates thru the elements in the
>>> ## given set argument and sorts them.
>>> my_sorted_elements = sorted(my_set)
>>>
>>> ## By default, the sorted() function assumes the following…
>>> ## The elements are strings
>>> ## The sorting is done in ascending order.
>>> my_sorted_elements
['0.002949589', '0.023685000', '0.0270662958', '0.030778000', '11.463524000', '4.927327899', '4.928857000']
>>>
>>> ## The sorted() function sorts the elements and returns a list object.
>>> type(my_sorted_elements)
<class 'list'>
>>>
```

The astute reader may have noticed above, that the sorting order is funky. That is: ‘0.030778000’, ‘11.463524000’, ‘4.927327899’

This is because the `sorted()` function assumes the set elements are strings, by default. Consider the first element in the `my_sorted_elements` list.

```>>> my_sorted_elements[0]
'0.002949589'
>>>
>>> type(my_sorted_elements[0])
<class 'str'>
>>>
```

## How to Sort Elements As Floats?

It is important to note that the sorted elements in the returned list are still strings. The sorted() function converts the elements into floats. It does this for the sole purpose of sorting them. After it sorts the elements, the sorted() function reverts them back to be string elements. The following code example shows how to sort the Set elements as floats

```\$ python
Python 3.9.0b5 (default, Oct 19 2020, 11:11:59)
>>>
>>> ## This is the original Set Object whose elements will be sorted.
>>> my_set = set(['4.928857000', '0.030778000', '4.927327899', '0.002949589', '0.023685000', '11.463524000', '0.0270662958'])
>>>
>>> ## The Python Built-in function “sorted()” iterates thru the elements in the
>>> ## given my_set argument and sorts them. This time as floats.
>>> my_sorted_elements = sorted(my_set, key=float)
>>>
>>> ## It should be noted that the elements in the returned list are  still strings.
>>> ## The sorted() function converts the elements into floats, for the sole purpose
>>> ## of sorting them, then reverts them back to be string elements
>>> my_sorted_elements
['0.002949589', '0.023685000', '0.0270662958', '0.030778000', '4.927327899', '4.928857000', '11.463524000']
>>>
>>> my_sorted_elements[0]
'0.002949589'
>>> type(my_sorted_elements[0])
<class 'str'>
>>>
>>> ## my_sorted_elements continues to be a list object.
>>> type(my_sorted_elements)
<class 'list'>
>>>
```

## Can The Sorting Order Be Changed?

The `sorted()` built-in function also offers the ‘reverse’ argument, to change the sorting order. Setting reverse=True, changes the sorting order to be descending. The following code shows how to change the sorting order to descending.

```\$ python
Python 3.9.0b5 (default, Oct 19 2020, 11:11:59)
>>>
>>> ## This is the original Set Object whose elements will be sorted.
>>> my_set = set(['4.928857000', '0.030778000', '4.927327899', '0.002949589', '0.023685000', '11.463524000', '0.0270662958'])
>>>
>>> ## As before, the Python Built-in “sorted()” function iterates thru the elements in the
>>> ## given my_set argument and sorts them as floats. This is now in done in descending
>>> ## order, because of the ‘reverse’ argument.
>>> my_sorted_elements = sorted(my_set, key=float, reverse=True)
>>>
>>> ## Also as before, the elements in the returned list are still strings.
>>> ## Also as before, the sorted() function converts the elements into floats, for the
>>> ## sole purpose of sorting them, then reverts them back to be string elements
>>> my_sorted_elements
['11.463524000', '4.928857000', '4.927327899', '0.030778000', '0.0270662958', '0.023685000', '0.002949589']
>>>
>>> my_sorted_elements[0]
'11.463524000'
>>> type(my_sorted_elements[0])
<class 'str'>
>>>
>>> ## Again as before, my_sorted_elements continues to be a list object.
>>> type(my_sorted_elements)
<class 'list'>
>>>
```

## What Happens If The Original Set Elements Are Floats?

The process remains the same if the original Set elements are floats. One does not need to provide the ‘key’ argument. Python is smart enough to recognize the elements as floats. Consider the following code.

```\$ python
Python 3.9.0b5 (default, Oct 19 2020, 11:11:59)
>>>
>>> ## This is the original Set Object whose elements will be sorted. This time the elements
>>> ## are floats.
>>> my_set = set([4.928857000, 0.030778000, 4.927327899, 0.002949589, 0.023685000, 11.463524000, 0.0270662958])
>>>
>>> type(my_set)
<class 'set'>

>>> ## Note that the ‘key’ argument is not needed, to sort as floats.
>>> my_sorted_elements = sorted(my_set)
>>>
>>> ## Python recognizes the set elements as floats and sorts them in ascending order
>>> my_sorted_elements
[0.002949589, 0.023685, 0.0270662958, 0.030778, 4.927327899, 4.928857, 11.463524]
>>>
>>> ## As before, my_sorted_elements continues to be a list object.
>>> type(my_sorted_elements)
<class 'list'>
>>>
>>> ## Unlike the earlier sections, the elements in the my_sorted_elements list are
>>> ## actually floats.
>>> my_sorted_elements[0]
0.002949589
>>> type(my_sorted_elements[0])
<class 'float'>
>>>
```

## What About Sorting In Descending Order?

Python is a very intuitive scripting language.  If there is sorting in ascending order, one can be sure there is a way to sort in descending order too. The ‘reverse’ argument tells the sorted() function to sort in descending order.  Consider the following code.

```\$ python
Python 3.9.0b5 (default, Oct 19 2020, 11:11:59)
>>>
>>> ## This is the original Set Object whose elements will be sorted. As above, the
>>> ## elements are float values.
>>> my_set = set([4.928857000, 0.030778000, 4.927327899, 0.002949589, 0.023685000, 11.463524000, 0.0270662958])
>>>
>>> type(my_set)
<class 'set'>

>>> ## Note that the ‘key’ argument is not needed, to sort as floats.
>>> my_sorted_elements = sorted(my_set, reverse=True)
>>>
>>> ## Python recognizes the set elements as floats and sorts them in ascending order
>>> my_sorted_elements
[11.463524, 4.928857, 4.927327899, 0.030778, 0.0270662958, 0.023685, 0.002949589]
>>>
>>> ## As before, my_sorted_elements continues to be a list object.
>>> type(my_sorted_elements)
<class 'list'>
>>>
>>> ## Unlike the earlier sections, the elements in the my_sorted_elements list are
>>> ## actually floats.
>>> my_sorted_elements[0]
11.463524
>>> type(my_sorted_elements[0])
<class 'float'>
>>>
```

## Conclusion

In Python, the Set object contains unordered elements. But, one can use the sorted() built-in function to sort its elements.  The original Set itself remains unchanged. The sorted() function returns a List object with the sorted elements. The sorted() function can take various arguments. These arguments specify the type of elements and/or the sorting order.