Python 用于多次应用字典的优雅语法

Python 用于多次应用字典的优雅语法,python,Python,想想我的字典d: d = {1: 2, 2: 3, 3: 1} 这只是字典形式的排列 我如何以一种语法优雅的方式重新应用这本词典 x = 1 # Not Elegant d[d[d[x]]] 1 我想创建一个函数,如: def f(d, k, n): for _ in range(n): k = d[k] return k 一个想法可能是构造一个高阶函数来应用函数n。像这样的时代: def func_mul(f,n=2): def g(x):

想想我的字典
d

d = {1: 2, 2: 3, 3: 1}
这只是字典形式的排列

我如何以一种语法优雅的方式重新应用这本词典

x = 1

# Not Elegant
d[d[d[x]]]

1
我想创建一个函数,如:

def f(d, k, n):
    for _ in range(n):
        k = d[k]
    return k

一个想法可能是构造一个高阶函数来应用函数n。像这样的时代:

def func_mul(f,n=2):
    def g(x):
        for _ in range(n):
            x = f(x)
        return x
    return g
另一种选择是使用某种
reduce
,如:

from functools import reduce

def func_mul(f,n=2):
    return lambda x : reduce(lambda xi, _ : f(xi),range(n),x)

虽然我同意如果你只需要一次函数,这仍然很难看。

一个想法可能是构造一个高阶函数来应用函数n。像这样的时代:

def func_mul(f,n=2):
    def g(x):
        for _ in range(n):
            x = f(x)
        return x
    return g
另一种选择是使用某种
reduce
,如:

from functools import reduce

def func_mul(f,n=2):
    return lambda x : reduce(lambda xi, _ : f(xi),range(n),x)

尽管我同意如果只需要一次函数,这仍然很难看。

我的简单解决方案是创建一个函数,如:

def walk(dict, start, iters):
    if iters <= 0:
        return start
    return walk(dict, dict[start], iters-1)
def步行(dict、start、iters):
如果iters我的即时解决方案是简单地创建一个函数,如:

def walk(dict, start, iters):
    if iters <= 0:
        return start
    return walk(dict, dict[start], iters-1)
def步行(dict、start、iters):
如果iters如果这是一个有序的dict,你只需遍历键值对就可以了否?你想完成什么?你的函数用3行短的代码完成了任务,不是吗?@Chris_Rands是的,它完成了。。。。但我坐在这里想知道是否有一种聪明的方法可以使用
reduce
/
map
类型的东西。。。我想不出一个,所以我想我会问。如果这是一个有序的dict,你只需要遍历键值对就可以了。不?你想完成什么?你的函数在3行短的行中完成任务,不是吗?@Chris_Rands是的,它完成了。。。。但我坐在这里想知道是否有一种聪明的方法可以使用
reduce
/
map
类型的东西。。。我想不出一个,所以我想问问。