Tôi đang cố gắng giải quyết nếu sự cố của tôi có thể giải quyết bằng hàm được sắp xếp() hoặc nếu tôi cần làm - trường cũ sử dụng cmp sẽ tương đối dễ.Python: sắp xếp danh sách phụ thuộc
dữ liệu thiết lập của tôi trông giống như:
x = [ ('business', Set('fleet','address')) ('device', Set('business','model','status','pack')) ('txn', Set('device','business','operator')) ....
Nguyên tắc phân loại nên về cơ bản cho tất cả các giá trị của N & Y trong đó Y> N, x [N] [0] không trong x [Y] [ 1]
Mặc dù tôi đang sử dụng Python 2.6, nơi đối số cmp vẫn có sẵn Tôi đang cố gắng làm cho Python 3 an toàn.
Vì vậy, điều này có thể được thực hiện bằng cách sử dụng một số phép thuật lambda và đối số chính không?
- == CẬP NHẬT == -
Cảm ơn Eli & Winston! Tôi đã không thực sự nghĩ rằng việc sử dụng chìa khóa sẽ làm việc, hoặc nếu tôi có thể nghi ngờ nó sẽ là một giải pháp còi giày mà không phải là lý tưởng.
Vì vấn đề của tôi là phụ thuộc vào bảng cơ sở dữ liệu, tôi phải bổ sung thêm mã của Eli để xóa một mục khỏi danh sách phụ thuộc của nó (trong cơ sở dữ liệu được thiết kế tốt, điều này sẽ không xảy ra.
giải pháp của tôi trên thế giới):
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' là gì ?? –
http://en.wikipedia.org/wiki/Topological_sorting – interjay
@JonClements Tôi cho rằng anh ta có nghĩa là 'sets.Set', mặc dù điều đó không được chấp nhận ngay cả trong Python 2.6 mà anh ta nói rằng anh ta đang sử dụng. Tuy nhiên, nếu đó là những gì ông có nghĩa là sau đó ông cần phải cung cấp một iterable duy nhất để constructor hơn là nhiều đối số. – Duncan