0

An example problem. The actual problem uses datetimes but this simplifies it for this example

unordered_list = [Class(letter='A', value=5), 
                  Class(letter='B', value=3), 
                  Class(letter='C', value=2), 
                  Class(letter='D', value=8), 
                  Class(letter='E', value=5), 
                  Class(letter='F', value=8)]

sorted_list = fun(unordered_list)

expected_result = [Class(letter='C', value=2),
                   Class(letter='B', value=3),
                   (Class(letter='A', value=5), Class(letter='E', value=5)),
                   (Class(letter='D', value=8), Class(letter='F', value=8))]
# or
expected_result = [(Class(letter='C', value=2)),
                   (Class(letter='B', value=3)),
                   (Class(letter='A', value=5), Class(letter='E', value=5)),
                   (Class(letter='D', value=8), Class(letter='F', value=8))]

I don't really mind what format they're in; list, set, tuple I'm not picky.

I've had a go at answering the question myself below. However I think there is a faster or more pythonic method.

Bit of extra code if you want to run the example problem

class Class:
    def __init__(self, letter, value):
        self.letter = letter
        self.value = value

    def __str__(self):
        return self.letter+'->'+str(self.value)

The python sort method (sorted(unordered_list, key=lambda x: x.value)) does not solve this problem by itself because items of the same value aren't grouped

Greg
  • 133
  • 7
  • The python sort method (sorted(unordered_list, key=lambda x: x.value)) does not solve this problem by itself because items of the same value aren't grouped – Greg Mar 25 '21 at 07:50
  • After more searching I believe this post https://stackoverflow.com/a/6602441/ probably is the answer I was looking for. This question was closed so I can't post that answer – Greg Mar 25 '21 at 08:19

1 Answers1

0

This is my go at answering it

def fun(unordered_list):
    value_getter = lambda obj: obj.value
    return custom_sort(unordered_list, value_getter)

def custom_sort(unordered_list, property_getter):
    values = {property_getter(a_class) for a_class in unordered_list}
    sorted_values = sorted(values)
    sorted_list = []
    for a_value in sorted_values:
        sorted_list.append([x for x in unordered_list if property_getter(x) == a_value])

    return sorted_list
Greg
  • 133
  • 7