多次应用字典的优雅语法

时间:2017-05-09 14:41:48

标签: 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

2 个答案:

答案 0 :(得分:3)

一个想法可能是构建一个高阶函数来应用函数 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)

然后我们可以写:

d3 = func_mul(d.get,3)
d3(x)

虽然我同意如果你只需要这个功能一次,那么它仍然是丑陋的

答案 1 :(得分:2)

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

def walk(dict, start, iters):
    if iters <= 0:
        return start
    return walk(dict, dict[start], iters-1)

一旦添加了错误处理,它看起来就会变得更加干净,但是我看不到一个很好的方法来做到这一点,而且看起来更简洁。