2016-12-21 12 views
1

辞書に関する質問があります。再帰関数を使用せずにこれを解決する方法を知りたいのですが(それは要件なので)。 このコードは、ネームリスト内の名前が相互に接続されたランダムな辞書を作成します。コードが何をすべきかは知っていますが、これを行う方法はわかりません。再帰のない辞書のキーと値のペアの最長サイクル

私は、(私はおそらく間違った/醜い方法で)抜き出したキーを必要とします。次に、開始キーが再び値として見つかるまで、コードの最後にある引用符のようにサイクル全体がループされます。ループは終了し、このサイクルの長さを返します。

以下のコードは、間違っていても私が思いついたものです。 の方が先に述べたようにの再帰関数がないといいです。

from random import seed, choice 
import time 
seed(0) 
nameslist = [ "Liam", "Emma", "Noah", "Olivia", ] 


# Creates random couples dictionary from a list 
def create_dictionary(nlist): 
    dict = {} 
    nlistcopy = nlist[:] 
    for item in nlist: 
     dict[item] = choice(nlistcopy) 
     nlistcopy.remove(dict[item]) 
    return dict 

# Generates the longest cycle in the couples dictionary, however, the code does not seem to work. 

def longest_cycle(dict): 
    longest = 0 
    for each in dict: 
     start = dict[each] 
     break 
    each = 0 
    while each != start : 
     for each in dict: 
      each = dict[each] 
      print(each) 
      longest += 1 
     time.sleep(5) 


namesdict = create_dictionary(nameslist) 
print(longest_cycle(namesdict)) 

# Dictionary = {'Liam': 'Olivia', 'Noah': 'Liam', 'Olivia': 'Noah', 'Emma': 'Emma'} 
# Liam --> Olivia --> Noah --> Liam (longest cycle = 3)! 

最終的な名前リストには、はるかに多くの名前が含まれます。この短いバージョンは、テスト目的のためのものです。スリープ時間は、無限ループが私のノートブックをクラッシュさせないように実装されています(私は問題に取り組むためにジュピターのノートブックを使用しています)。前もって感謝します!

+0

[連続したタプルのリストをソートする](http://stackoverflow.com/questions/41221428/sort-a-list-of-tuples-in-consecutive-order) –

+0

私はしませんこれはDFSのように見えます – Har

+1

上記のdupeと同様の各キーから連続したdictのリストを見つける必要があります。カウンターで各キーのパスをマップします。最後にカウンター –

答えて

1

よりよい解決策があるかどうかはわからないけど、とにかく、これは非常に単純であり、任意の再帰関数を使用していません:

dict = {'Liam': 'Olivia', 'Noah': 'Liam', 'Olivia': 'Noah', 'Emma': 'Emma'} 

result = 0 
longest = 1 # longest_cycle of a key, always == 1 at first 

for key in dict.keys(): 
    dest = key 
    key = dict[key] 
    while dest != key: 
     key = dict[key] 
     longest += 1 
    if longest > result: 
     result = longest 
    longest = 0 

print(result) 
0

ファーズの事はちょうどlistなどの予約語であるdictを付けないように第二のコードを簡素化してみましょう:

import random 

def create_names_dict(names_list): 
    names_list_random = names_list[:] 
    random.shuffle(names_list_random) 
    return {k:v for k,v in zip(names_list, names_list_random)} 

次のステップ:

def longest_cycle(names_list, names_dict): 
    start = names_list[0] 
    key = start 
    value = names_dict[start] 
    longest = [start] 
    while start != value: 
     longest.append(value) 
     key, value = value, names_dict[value] 
    longest.append(value) 
    print('%s (longest cycle: %d)' % (' --> '.join(longest), len(longest) - 1)) 

試験:

>>> names_list = [ "Liam", "Emma", "Noah", "Olivia", ] 
>>> names_dict = create_names_dict(names_list) 
>>> names_dict 
{'Noah': 'Noah', 'Liam': 'Emma', 'Olivia': 'Liam', 'Emma': 'Olivia'} 
>>> longest_cycle(names_list, names_dict) 
Liam --> Emma --> Olivia --> Liam (longest cycle: 3) 

乾杯!

関連する問題