如何基于层次结构对数据进行排序

时间:2018-06-05 16:26:06

标签: python list sorting

我有一个字符串列表如下:

["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 :(得分:7)

这是使用sorted和自定义键的一种方式:

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

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

答案 1 :(得分:3)

一种方法是将每个项目拆分为::,然后排序,然后加入:

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']

答案 2 :(得分:0)

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]之间。并对这些列表进行排序后,sort函数会返回您的预期结果。