我有一个对象列表,其中每个对象都有start
和end
属性,如:
Item 0:
Start: 1
End: 12
Item 1:
Start: 6
End: 3
Item 2:
Start: 12
End: 6
我想对它们进行排序,以使每个项目的start
和end
与新列表中之前和之后的项目匹配。
所以在这个例子中,它将是:
[Item 0] [Item 2] [Item 1]
[1 12] [12 6] [6 3]
如果整个清单被颠倒过来并不重要。
此外还有2个不相关的列表如上所述,因此我必须形成2个新列表,这些列表将具有如上所示的正确顺序。
我只是要开始实现它“蛮力”,所以做了很多查询来创建这些列表,但我想问一下是否有人可能有更优雅的方法来解决这个问题。我不确定这种问题有多常见,但我记得以前看过这个问题,所以也许有一些模式可以解决这个问题。
答案 0 :(得分:2)
假设每个开始和结束的开始/结束都有完美的匹配:
items_by_start = dict((i.start, i) for i in your_items)
ordered_items = [your_items[0]]
for _ in xrange(len(your_items)-1):
ordered_items.append(items_by_start[ordered_items[-1].end])
答案 1 :(得分:1)
订购元素表明没有重复的项目。但是,对于重复的start
或end
s,您必须更加小心(并且可能有多个解决方案)。问题类似于在无向图的Eulerian paths中找到connected components,可以通过将每个(start
,end
)对视为图边来获得。{ / p>
有很多关于如何在Web上实现Python的示例。请记住,它可以在O(m)时间内轻松完成,其中m是边数。
此外,当且仅当每个顶点具有偶数度时,存在欧几里德路径。如果图表中有许多组件,它仍然有用。