我正在尝试确定我的问题是否可以使用内置的 sorted() 函数解决,或者我是否需要自己解决 - 使用 cmp 的老学校会相对容易。
我的数据集如下所示:
x = [ ('企业', Set('车队', '地址')) ('device', Set('business','model','status','pack')) ('txn', Set('device','business','operator')) ……
排序规则应该基本上适用于 N & Y 的所有值,其中 Y > N,x[N][0] 不在 x[Y][1] 中
尽管我使用的是仍然可以使用 cmp 参数的 Python 2.6,但我正在尝试使这个 Python 3 安全。
那么,这可以使用一些 lambda 魔术和 key 参数来完成吗?
-== 更新 ==-
谢谢伊莱和温斯顿!我真的不认为使用 key 会起作用,或者如果可以的话,我怀疑这将是一个不理想的鞋拔解决方案。
因为我的问题是数据库表依赖项,所以我不得不对 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