【问题标题】:Longest cycle of key-value pairs in a dictionary without recursion没有递归的字典中键值对的最长循环
【发布时间】:2016-12-21 11:13:08
【问题描述】:

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

我需要成功提取的起始密钥(可能以不正确/丑陋的方式)。然后代码应该循环整个循环,如我的代码底部的引号所示,直到再次找到起始键作为值。然后循环应该结束并返回这个循环的长度。

下面的代码是我设法想出的,即使它是错误的。 如前所述,我更喜欢没有递归函数的答案。

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 笔记本来解决这个问题)。提前致谢!

【问题讨论】:

  • 我不这么认为,这看起来更像是一个 DFS
  • 你需要找到从每个键开始的连续字典列表,类似于上面提到的欺骗。用计数器映射每个键的路径。最后可以根据计数器提取路径
  • @Menno Van Dijk 你应该看看我的回答,你可以在未来使用一些东西

标签: python dictionary


【解决方案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)

【讨论】:

    【解决方案2】:

    首先避免将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))
    

    测试:

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

    干杯!

    【讨论】:

      猜你喜欢
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多