Как отсортировать список в Python3, где с элементами не определен оператор cmp?
Я бы хотел отсортировать список, в котором элементы сопоставимы друг с другом с определенным правилом, но там, где для них не определены явные простые операторы сравнения (например, <
и >
). Возьмем для примера набор словарей и его коллекцию (список):
dNik = { 'id': 'Nik', 'parent': 'Ann' }
dAnn = { 'id': 'Ann', 'parent': '' }
dBob = { 'id': 'Bob', 'parent': 'Nik' }
arry = [ dNik, dAnn, dBob ]
Относительное соотношение этих словарей может быть определено; в основном,
Bob (child) < Nik (parent) < Ann (grandparent)
( РЕДАКТИРОВАТЬ - Здесь dBob
ничего не знает о dAnn
и dAnn
ничего не знает о других -)
Итак, я хотел бы отсортировать список arry
с перетасованными их элементами в следующем порядке отношения потомок-родитель;
arry = [ dNik, dAnn, dBob ]
sorted(arry, key=lambda i: SOMETHING)
# => [ dBob, dNik, dAnn ]
Каков (лучший) способ добиться этого?
( РЕДАКТИРОВАТЬ - алгоритм не должен использовать встроенный sorted()
, но все, что достигает цели, прекрасно! -)
Примечание : в этом простом Как правило, словарь может иметь несколько дочерних словарей. В таком случае, скажем, связь между этими дочерними хешами не определена (или вы можете ввести другое правило, например, алфавитный порядок с именем). В любом случае.
[EDIT] :
Как указано в комментариях и ответе, это проблема топологической сортировки , которую невозможно реализовать с помощью встроенный sort()
или sorted()
в Python (3.8). Теперь, чтобы уточнить, у меня вопрос просто: «Как выполнить сортировку, как описано в примере»?
Замечу, что pip -установляемый базовый c Python module toposort * Для него доступно 1044 * (которое будет встроено в предстоящем Python -3.9 как functools.TopologicalSorter () . Это кажется полезным, хотя случай в этом вопросе требует немного работы применить его к.