2017-01-29 17 views
2

私は値のリストを[0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [5,7], [7,9]の形で持っています。各リスト要素(Python)の文字値に基づいてリストを反復する

[0,1]で始まるリストを繰り返し、2番目の文字(この場合は1)が別のリスト要素の最初の文字のものと等しい場合(この場合は[1,3]に対応します。 [1,3]に移動して[3,5], [5,7]、最後に[7,9]でしょう。それは第二の要素([0,2])で開始し、二つのリストで最高潮に達する、同じことをするだろう、その時点で。

明確にするために、リスト自体も、両方とも値が含まれており、私がここに示した例とは違って、奇妙なので、それに基づいて分割することはできません。

これで正しい方向に私をプッシュするためのアイデアは非常に高く評価されます。ここで

+3

いくつかのコードを試しましたか? – Alex

+2

複数の選択肢がある場合はどうしますか?リストに '[1,3]'と '[1,4]'の両方が含まれているとしますか? –

+0

上記の例を続けると、[7,9]まで[0,1]を実行し、[4,6]に戻るまで[0,2]を返します。 –

答えて

1

はあまりにも別の未訪問のパスの世話をし、できるだけ長くのためのアイテムを追跡しようとする再帰的なソリューションです:

この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)] 
+0

この考えに感謝します。残念ながら、リストには常に同じ値のk値が含まれているので、私は検索方法から離れていきます。 –

+0

まだルックアップが必要です。とにかく、ここにあなたの明確な要件の更新版があります。 – poke

+0

あなたの助けてくれてありがとう、私はこの周りに頭を浮かべるだろう。 –

0

は、あなたが使用している通常の方法を反復することはできませんforループは特定の値にジャンプすることができないため、 "for"ループです。したがって、whileループを使用してください。このコードは、最後と最初の値と一致するすべてのバリューパックを検出します。したがって、複雑なリストの真ん中から一致する値を見つけるためにも使用できます。

listoflists = [[0,1], [0,2], [1,3], [2,4], [3,5], [4,6], [7,9]] 

addr0 = 0 
addr1 = 0 
print len(listoflists) 
while addr0 < len(listoflists): 
    val0 = listoflists[addr0] 
    last_num = val0[1] 
    while addr1 < len(listoflists): # Second iteration for finding the matching value 
     val1 = listoflists[addr1] 
     if val1[0] == last_num: 
      print "found: ",listoflists[addr0], listoflists[addr1] # Found the matching values 
      addr0 = addr1 
      break 
     addr1 += 1 
    addr0 += 1 
関連する問題