功能查找键在字典中,直到不再有关联的值(function that looks up keys in

2019-10-29 06:00发布

我需要帮助创建一个通过给定的字典去的功能。 与该键关联的值可能是另一个关键字典。 我需要的功能,以保持查找键,直到到达不具有关联价值的关键。

def follow_me(d, s):

    while d:
        if s in d:
            return d[s]

我可以在s等于到字典中返回的值,但我不知道如何来遍历它,直到我得到不具有关联的值。 所以,我可以得到獾是母鹿的价值,但我怎么通过字典迭代,直到我得到的狐狸,然后狐狸母鸡等。

d = {'badger':'doe', 'doe':'fox', 'fox':'hen','hen':'flea',
'sparrow':'spider', 'zebra':'lion', 'lion':'zebra'}
print(follow_me(d, 'badger'))
print(follow_me(d, 'fox'))
print(follow_me(d, 'sparrow'))
print(follow_me(d, 'zebra'))
print(follow_me(d, 'aardvark'))

这就是我目前有对我来说很有意义,因为一切我已经尝试是错误的功能。

def follow_me(d, s):
    while d:
        if s in d:
            return d[s]

和输出要求是:

flea
flea
spider
aardvark

但我的代码现在的问题是生产:

doe
hen
spider
lion

Answer 1:

为了扩大对其他的答案,这仍然是有效的。 如果你有一个非常大的字典,然后用key not in dic.keys()k in d遍历所有键的每一个循环。

去解决这个问题,可以使用一个尝试捕捉:

def follow_me(dic, key):
    while True:
        if key not in dic.keys():
            return key
        key = dic[key]


def follow_me2(dic, key):
    try:
        while True:
            key = dic[key]
    except Exception as e:
        return key

import time
d = { i: (i+1) for i in range(10000000) }
start = time.time()
follow_me(d, 0)
print("Using 'in' takes", time.time() - start,"s")

start = time.time()
follow_me2(d, 0)
print("Using 'try' takes", time.time() - start,"s")

给人的输出:

Using 'in' takes 2.476428747177124 s
Using 'try' takes 0.9100546836853027 s


Answer 2:

认为这是你在找什么,但你的问题描述非常清楚:

def follow_me(d, k):
    while k in d:
        k = d[k]
    return k

请注意,在此功能的循环将永远运行下去,如果在你的字典键和值之间的周期。 你举的例子有之间的一个'lion''zebra' ,你打算如何这样的循环被打破它并不完全清楚。 如果你想扩展每个键只有一次,你可以通过跟踪你在迄今为止看到的值的处理它set

def follow_me(d, k):
    seen = set()
    while k in d and k not in seen:
        seen.add(k)
        k = d[k]
    return k

这将返回你先到达者为准循环键(所以follow_me(d, 'zebra')与例词典将返回'zebra'会后zebra => lion => zebra )。 如果你想一些其他的结果,你需要不同的逻辑,它可能会非常棘手的事情。

如果您要求的关键,这不是在字典(如'aardvark'在你的例子),要求的密钥将被立即返回。 您可以添加特殊处理为你查找第一个键,但它会再次使事情更加复杂。



Answer 3:

考虑到无限循环这个具有的存在来处理。 您的描述不清楚在这种情况下会发生什么。

def follow_me(d, key):
    visited_keys = []
    while key not in visited_keys and d[key]:
        visited_keys.append(key)
        key = d[key]
    if not d[key]:
        return key
    return "this hunt has no end"


文章来源: function that looks up keys in a dictionary until there is no more associated values