我需要帮助创建一个通过给定的字典去的功能。 与该键关联的值可能是另一个关键字典。 我需要的功能,以保持查找键,直到到达不具有关联价值的关键。
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
为了扩大对其他的答案,这仍然是有效的。 如果你有一个非常大的字典,然后用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
我认为这是你在找什么,但你的问题描述非常清楚:
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'
在你的例子),要求的密钥将被立即返回。 您可以添加特殊处理为你查找第一个键,但它会再次使事情更加复杂。
考虑到无限循环这个具有的存在来处理。 您的描述不清楚在这种情况下会发生什么。
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