Python 字典中无递归的键值对的最长周期

Python 字典中无递归的键值对的最长周期,python,dictionary,Python,Dictionary,我有一个关于词典的问题。我想知道如何在不使用递归函数的情况下解决这个问题(因为这是一个要求)。 代码创建一个随机字典,其中名称列表中的名称相互连接。我知道代码应该做什么,但不知道如何做 我需要启动键,我成功地提取了它(可能是以错误/丑陋的方式)。然后代码应该循环整个循环,如代码底部的报价所示,直到开始键再次被发现为值。然后循环应该结束并返回此循环的长度 下面的代码是我设法想出的,尽管它是错误的。 我希望答案没有前面提到的递归函数 from random import seed, choice i

我有一个关于词典的问题。我想知道如何在不使用递归函数的情况下解决这个问题(因为这是一个要求)。 代码创建一个随机字典,其中名称列表中的名称相互连接。我知道代码应该做什么,但不知道如何做

我需要启动键,我成功地提取了它(可能是以错误/丑陋的方式)。然后代码应该循环整个循环,如代码底部的报价所示,直到开始键再次被发现为值。然后循环应该结束并返回此循环的长度

下面的代码是我设法想出的,尽管它是错误的。 我希望答案没有前面提到的递归函数

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)! 

最终的名称列表将包含更多的名称,这个较短的版本仅用于测试目的。睡眠时间的实现是为了防止无限循环破坏我的笔记本(我正在使用Jupyter笔记本解决这个问题)。提前谢谢

我不知道是否有更好的解决方案,但无论如何,这非常简单,不使用任何递归函数:

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)

首先要避免命名
dict
,这是一个像
list
一样的保留字,其次让我们简化代码:

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))
测试:


干杯

我不这么认为,这看起来更像是一个DFS。你需要找到从每个键开始的连续dict列表,类似于上面提到的dupe。使用计数器映射每个键的路径。最后,您可以根据以下内容提取路径:counter@Menno范迪克,你应该看看我的答案,有几件事你可以在未来使用
>>> 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)