I have a list of objects in python, where a single object has 2 attributes ie. a and b, a can be either None or dict and b is an int or None, I want the resultant list to be sorted like:
- It should have first all objects with
a equal to None. - Then it should have all objects with
a not equal to None. - In 1, 2 if those objects have
b(b is int) then sort them with b.
Example result:
[
Obj(a=None, b=2),
Obj(a=None, b=5),
Obj(a=None, b=None),
Obj(a=dict, b=1),
Obj(a=dict, b=4),
Obj(a=dict, b=None)
]
CodePudding user response:
This will do it using sorted(), and a similar approach would work with the sort() method of the list datatype:
class Obj:
def __init__(self, a, b):
self.a = a
self.b = b
input = [
Obj(a=dict(), b=1),
Obj(a=dict(), b=None),
Obj(a=None, b=5),
Obj(a=None, b=None),
Obj(a=dict(), b=4),
Obj(a=None, b=2),
]
output = sorted(input, key=lambda x: (x.a is not None, x.b is None, x.b))
[print(f"Obj(a={'dict' if x.a is not None else 'None'}, b={x.b})") for x in output]
Output:
Obj(a=None, b=2)
Obj(a=None, b=5)
Obj(a=None, b=None)
Obj(a=dict, b=1)
Obj(a=dict, b=4)
Obj(a=dict, b=None)
