【发布时间】:2012-06-03 08:34:27
【问题描述】:
好的。这可能很难,但我已经挣扎了很多,没有很大的进步,所以我想知道你们的想法。
假设我有以下对象列表:
objects = [
{'id': '1', 'w': 0.20},
{'id': '1.1', 'w': 0.80},
{'id': '1.2', 'w': 0.20},
{'id': '1.3', 'w': 0.30},
{'id': '1.1.1', 'w': 0.60},
{'id': '1.1.2', 'w': 0.70},
{'id': '1.1.3', 'w': 0.40},
{'id': '1.2.1', 'w': 0.30},
]
我想按“id”(例如'1', '1.1', '1.1.1', '1.1.2', '1.1.3', '1.2', '1.2.1', '1.3')对这个列表进行排序,但是具有相同父级的所有元素都需要按“w”排序(相反)。我所说的“同父异母”是什么意思?那么,“1”是“1.1”、“1.2”和“1.3”的父级。同样,“1.1”是“1.1.1”、“1.1.2”、“1.1.3”的父级,“1.2”是“1.2.1”的父级。为了更好地说明这一点,假设这是一个带有嵌套 cmets 的线程的表示('1' 是原始帖子,'1.1' 是它的答案,等等)。
目前,我已经能够达到以下表格:
[ [ {'w': 0.2, 'id': '1'} ], [ {'w': 0.8, 'id': '1.1'}, {'w': 0.3, 'id': '1.3'},
{'w': 0.2, 'id': '1.2'} ], [ {'w': 0.7, 'id': '1.1.2'}, {'w': 0.6, 'id': '1.1.1'},
{'w': 0.4, 'id': '1.1.3'} ], [ {'w': 0.3, 'id': '1.2.1'} ] ]
如您所见,每个嵌套列表都包含其他元素的子元素。例如,第二个嵌套列表[ {'w': 0.8, 'id': '1.1'}, {'w': 0.3, 'id': '1.3'}, {'w': 0.2, 'id': '1.2'} ] 包含元素[ {'w': 0.2, 'id': '1'} ] 的所有子元素。此外,每个嵌套列表都按“w”排序。
最终结果应该是这样的(假设链接所有内部列表 - list(itertools.chain(*b))):
{'id': '1', 'w': 0.20}, {'id': '1.1', 'w': 0.80}, {'id': '1.1.2', 'w': 0.70},
{'id': '1.1.1', 'w': 0.60}, {'id': '1.1.3', 'w': 0.40}, {'id': '1.3', 'w': 0.30},
{'id': '1.2', 'w': 0.20}, {'id': '1.2.1', 'w': 0.30}
基本上,先是父元素,然后是子元素(按 'w' 排序),这同样适用于每个元素(当然,如果它有子元素 - 这里 {'id': '1.3', 'w': 0.30} 没有子元素,所以我们没有'不需要对它做任何事情)。
我已经尝试了一些事情(太复杂以至于不值得解释)。我最终得到了很多条件和一个丑陋的代码。
我怎样才能完成这种排序?
提前致谢。
【问题讨论】:
-
您发布为所需结果的样本未按照您的描述进行排序。例如
1.1.2在1.1.1之前;而w是任意排序的。 -
@BurhanKhalid w 是反向排序的,如果你仔细看,结果确实有意义。
-
@BurhanKhalid 是的,正如 jamylak 所说,1.1.2 之前是因为它是 1.1 的子代,所以根据我的描述,它们应该按“w”排序(先是 0.70,然后是 0.60)。抱歉,我错过了说明。
标签: python list sorting object