我想解決如果我的問題是可以解決使用內置排序()函數,或者如果我需要自己做 - 使用cmp的老學校本來會相對容易。Python:排序依賴列表
我的數據集看起來像:
x = [ ('business', Set('fleet','address')) ('device', Set('business','model','status','pack')) ('txn', Set('device','business','operator')) ....
排序規則應基本對於N & Y,其中Y> N,X [N] [0]不是在X [Y] [所有值1]
儘管我使用Python 2.6,其中cmp參數仍然可用,但我試圖讓這個Python 3安全。
那麼,這可以使用一些lambda魔術和關鍵參數來完成?
- == UPDATE == -
感謝禮&溫斯頓!我真的不認爲使用鑰匙會起作用,或者如果我能懷疑它會是一種不理想的鞋子喇叭解決方案。
因爲我的問題是數據庫表依賴關係,我不得不對Eli的代碼做一個小的添加,以便從它的依賴列表中刪除一個項目(在設計良好的數據庫中,這不會發生,但是誰住在那個神奇的完美世界)
我的解決方案:
def topological_sort(source):
"""perform topo sort on elements.
:arg source: list of ``(name, set(names of dependancies))`` pairs
:returns: list of names, with dependancies listed first
"""
pending = [(name, set(deps)) for name, deps in source]
emitted = []
while pending:
next_pending = []
next_emitted = []
for entry in pending:
name, deps = entry
deps.difference_update(set((name,)), emitted) # <-- pop self from dep, req Py2.6
if deps:
next_pending.append(entry)
else:
yield name
emitted.append(name) # <-- not required, but preserves original order
next_emitted.append(name)
if not next_emitted:
raise ValueError("cyclic dependancy detected: %s %r" % (name, (next_pending,)))
pending = next_pending
emitted = next_emitted
什麼是'Set'? – 2012-07-19 08:56:56
http://en.wikipedia.org/wiki/Topological_sorting – interjay 2012-07-19 09:05:14
@JonClements我會假設他的意思是'sets.Set',儘管在他說他使用的Python 2.6中已經廢棄了。但是,如果這就是他的意思,那麼他需要向構造函數提供一個迭代器,而不是多個參數。 – Duncan 2012-07-19 12:50:32