Как сортировать данные по иерархии - PullRequest
0 голосов
/ 05 июня 2018

У меня есть список строк следующим образом:

["a","aa", "b","bbb", "c", "a::b", "a::b::c", "a::b::d", "b:c"]

Я хочу отсортировать это как

["a", "a::b", "a::b::c", "a:b::d", "aa", "b", "b:c", "bbb", "c"]

и так далее.Просто для контекста ... "::" действует как разделитель, который представляет иерархию.Итак, учитывая объект верхнего уровня "a" .. мы сначала получаем "a :: b", "a :: b :: c" .. и всех потомков .., прежде чем перейти к следующему объекту верхнего уровня "aa".

Что было бы хорошим способом решить эту проблему в python (интересно, есть ли что-нибудь в коллекциях или в библиотеке itertools, я не смог найти подходящий метод)?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018

Вот один способ, используя sorted и пользовательский ключ:

res = sorted(lst, key=lambda x: x.split('::'))

['a', 'a::b', 'a::b::c', 'a::b::d', 'aa', 'b', 'b:c', 'bbb', 'c']
0 голосов
/ 05 июня 2018
my_list = ["a","aa", "b","bbb", "c", "a::b", "a::b::c", "a::b::d", "b:c"]
my_result = sorted(my_list, key=lambda value: value.split('::'))

Во время сортировки каждый элемент списка будет разделен, например: "a::b::c" создаст список ["a","b","c"].Ваша фактическая сортировка будет среди ["a"],["aa"],["b"],["bbb"],["c"],["a","b"],["a","b","c"],["b","c].И сортируя эти списки, функция сортировки возвращает ожидаемый результат.

0 голосов
/ 05 июня 2018

Один из способов - разделить каждый элемент на ::, затем отсортировать, а затем объединить:

In [14]: l = ["a", "aa", "b", "bbb", "c", "a::b", "a::b::c", "a::b::d", "b::c"]

In [15]: map('::'.join, sorted(item.split('::') for item in l))
Out[15]: ['a', 'a::b', 'a::b::c', 'a::b::d', 'aa', 'b', 'b::c', 'bbb', 'c']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...