Home > other >  How to sort a list containing frozensets (python)
How to sort a list containing frozensets (python)

Time:02-04

I have a list of frozensets that I'd like to sort, Each of the frozensets contains a single integer value that results from an intersection operation between two sets:

k = frozenset(w) & frozenset(string.digits)
d[k] = w # w is the value
list(d) # sorted(d) doesn't work since the keys are sets and sets are unordered.

Here is the printed list:

[frozenset({'2'}), frozenset({'1'}), frozenset({'4'}), frozenset({'3'})]

How can I sort the list using the values contained in the sets?

CodePudding user response:

You need to provide function as key to sorted which would accept frozenset as argument and return something which might be compared. If each frozenset has exactly 1 element and said element is always single digit then you might use max function (it will extract that single element, as sole element is always biggest element of frozenset) that is

d1 = [frozenset({'2'}), frozenset({'1'}), frozenset({'4'}), frozenset({'3'})]
d2 = sorted(d1,key=max)
print(d2)

output

[frozenset({'1'}), frozenset({'2'}), frozenset({'3'}), frozenset({'4'})]

If you want to know more read Sorting HOW TO

CodePudding user response:

Previous answers can not sorted correctly, Because of strings

d = [frozenset({'224'}), frozenset({'346'}), frozenset({'2'}), frozenset({'22345'})]
sorted(d, key=lambda x: int(list(x)[0]))

Output:

[frozenset({'2'}),
 frozenset({'224'}),
 frozenset({'346'}),
 frozenset({'22345'})]

CodePudding user response:

Honestly, unless you really need to keep the elements as frozenset, the best might be to generate a list of values upstream ([2, 1, 4, 3]).

Anyway, to be able to sort the frozensets you need to make them ordered elements, for instance by converting to tuple. You can do this transparently using the key parameter of sorted

l = [frozenset({'2'}), frozenset({'1'}), frozenset({'4'}), frozenset({'3'})]

sorted(l, key=tuple)

or natsorted for strings with multiple digits:

from natsort import natsorted
l = [frozenset({'2'}), frozenset({'1'}), frozenset({'14'}), frozenset({'3'})]

natsorted(l, key=tuple)

output:

[frozenset({'1'}), frozenset({'2'}), frozenset({'3'}), frozenset({'14'})]
  •  Tags:  
  • Related