はあまりにも別の未訪問のパスの世話をし、できるだけ長くのためのアイテムを追跡しようとする再帰的なソリューションです:
このLKE使用し
from collections import defaultdict
def split(items):
# create lookup
lookup = defaultdict(set)
for k, v in items:
lookup[k].add(v)
results = []
while sum(map(len, lookup.values())):
# get first element from remaining items
first_k = min((k for k in lookup if len(lookup[k])))
first = first_k, min(lookup[first_k])
# follow that element
results.append(follow(first, lookup))
return results
def follow(item, lookup):
item_k, item_v = item
lookup[item_k].remove(item_v)
result = [item]
# loop through all follow-up items (if any)
for next_item in sorted(lookup[item_v]):
# recursively follow the follow-up item
result.extend(follow((item_v, next_item), lookup))
return result
:
>>> def test(items):
for x in split(items):
print(x)
>>> test([[0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [7,9]])
[(0, 1), (1, 3), (3, 5)]
[(0, 2), (2, 4), (4, 6)]
[(7, 9)]
それはパスを無視します既に訪問されたアイテムへ:
>>> test([[0, 1], [1, 2], [4, 3], [2, 5], [5, 1]])
[(0, 1), (1, 2), (2, 5), (5, 1)]
[(4, 3)]
ために、複数のもの(ソートされた、オリジナルではないため)がある場合:
>>> test([[0, 1], [1, 2], [1, 3], [2, 4], [3, 5]])
[(0, 1), (1, 2), (2, 4), (1, 3), (3, 5)]
そして、それはあまりにもあなたの複雑な例のために働く:
>>> test([[0, 1], [0, 2], [1, 3], [2, 4], [3, 5], [4, 6], [5, 7], [7, 9], [8, 10], [8, 11], [10, 12], [11, 13], [11, 14], [12, 15], [12, 16], [6, 8], [8, 17]])
[(0, 1), (1, 3), (3, 5), (5, 7), (7, 9)]
[(0, 2), (2, 4), (4, 6), (6, 8), (8, 10), (10, 12), (12, 15), (12, 16), (8, 11), (11, 13), (11, 14), (8, 17)]
いくつかのコードを試しましたか? – Alex
複数の選択肢がある場合はどうしますか?リストに '[1,3]'と '[1,4]'の両方が含まれているとしますか? –
上記の例を続けると、[7,9]まで[0,1]を実行し、[4,6]に戻るまで[0,2]を返します。 –