在Python中执行此操作的最佳方法是什么?

时间:2013-02-24 23:31:20

标签: python list sorting collections

我有一个对象列表,其中每个对象都有startend属性,如:

Item 0:
Start: 1
End: 12

Item 1:
Start: 6
End: 3

Item 2:
Start: 12
End: 6

我想对它们进行排序,以使每个项目的startend与新列表中之前和之后的项目匹配。

所以在这个例子中,它将是:

[Item 0] [Item 2] [Item 1]
[1   12] [12   6] [6    3]

如果整个清单被颠倒过来并不重要。

此外还有2个不相关的列表如上所述,因此我必须形成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)

订购元素表明没有重复的项目。但是,对于重复的startend s,您必须更加小心(并且可能有多个解决方案)。问题类似于在无向图的Eulerian paths中找到connected components,可以通过将每个(startend)对视为图边来获得。{ / p>

有很多关于如何在Web上实现Python的示例。请记住,它可以在O(m)时间内轻松完成,其中m是边数。

此外,当且仅当每个顶点具有偶数度时,存在欧几里德路径。如果图表中有许多组件,它仍然有用。