我想确定能否使用内置的sorted()函数解决我的问题,如果不能,我需要自己编写代码来排序。我的数据集如下所示:
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函数和key参数完成此操作?
-== UPDATE ==-
谢谢Eli和Winston!我真的没有想到可以使用key参数解决问题,或者如果它可以,我怀疑它会是一个勉强解决方案,这并不理想。
由于我的问题是关于数据库表依赖关系的,因此我必须稍微修改Eli的代码以从其依赖列表中删除一个项目(在设计良好的数据库中,这不会发生,但是谁生活在那个神奇完美的世界中呢?)
我的解决方案:
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函数和key参数完成此操作?
-== UPDATE ==-
谢谢Eli和Winston!我真的没有想到可以使用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
sets.Set
,不过这在他所说的使用 Python 2.6 甚至已经被弃用了。然而,如果他的意思是这个的话,那么他需要向构造函数提供单个的可迭代对象,而不是多个参数。 - Duncan