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

2
  • 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 Commented Mar 25, 2021 at 7:50
  • After more searching I believe this post stackoverflow.com/a/6602441 probably is the answer I was looking for. This question was closed so I can't post that answer Commented Mar 25, 2021 at 8:19

1 Answer 1

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
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.