簡體   English   中英

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

[英]What's the best way to do this in Python?

我有一個對象列表,其中每個對象都有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個具有正確順序的新列表,如上所示。

我將開始以“蠻力”方式實現它,因此要進行大量查詢來創建這些列表,但我想問一問是否有人可以采用更優雅的方式來解決此問題。 我不確定這種問題有多普遍,但我記得以前曾見過,所以也許有一些模式可以解決這個問題。

假設每個起點和終點都有一個完美的起點/終點匹配:

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

排序元素表明沒有重復的項目。 但是,對於重復的startend您必須格外小心(可能有多個解決方案)。 問題將等同於在無向圖的連接組件中找到歐拉路徑 ,這可以通過將每對( startend )對視為圖邊來獲得。

關於如何在Web上的Python中實現它的例子不勝枚舉。 請記住,可以很容易地在O(m)時間內完成操作,其中m是邊數。

同樣,當且僅當每個頂點具有偶數度數時,才存在歐幾里德路徑。 如果圖形中有很多組件,它仍然成立。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM