私の問題が組み込みの sorted() 関数を使用して解決できるかどうか、または自分で解決する必要があるかどうかを解決しようとしています - cmp を使用する古い学校は比較的簡単でした。
私のデータセットは次のようになります:
x = [ ('ビジネス', Set('フリート','住所')) ('デバイス', Set('ビジネス','モデル','ステータス','パック')) ('txn', Set('device','business','operator')) ....
ソート規則は、基本的に、Y > N、x[N][0] が x[Y][1] にない N & Y のすべての値に適用する必要があります。
cmp引数がまだ利用可能なPython 2.6を使用していますが、このPython 3を安全にしようとしています。
それで、これはいくつかのラムダマジックとキー引数を使用して行うことができますか?
-== 更新 ==-
エリとウィンストンに感謝!キーの使用がうまくいくとは思っていませんでした。または、うまくいくとしたら、理想的ではない靴べらのソリューションになるのではないかと疑っていました。
私の問題はデータベース テーブルの依存関係に関するものだったので、依存関係のリストから項目を削除するために、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