2013-02-24 58 views
0

我有对象的列表,每个人有startend的属性,如:在Python中这样做的最好方法是什么?

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

假设有完美的比赛跌宕的开始/结束的每一个起点和终点:

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]) 
+0

另外假设没有重复的'开始'。 – 2013-02-24 23:36:00

+0

非常感谢,我会试一试。我认为这不会在意同一组中的两个独立列表,对吧? – 2013-02-24 23:38:18

+0

@JoanVenge如果你有两个单独的列表,你会遇到循环重复的问题;你必须使用稍微复杂的逻辑。 – Amber 2013-02-25 00:09:54

1

订购的元素表明没有重复的项目。但是,如果您使用重复的startend,您必须更加小心(并且可能有多个解决方案)。这个问题将等于找到无向图中的的Eulerian paths,其可以通过将每个(start,end)对视为图边来获得。

关于如何在网络上使用Python实现它的例子已经非常多。请记住,它可以在O(m)时间内轻松完成,其中m是边的数量。

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

+0

谢谢,我的清单没有重复项目,基本上每个项目都保证有独特的开始和结束。但我也发现一些开始和结束的价值观可能会颠倒过来。 – 2013-02-25 16:20:20

相关问题