2017-05-09 15 views
0

は私の辞書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 
+0

これが順序付き辞書であれば、キーと値のペアを歩くだけでいいですか? – EdChum

+4

あなたは何を達成しようとしていますか? – canyon289

+0

あなたの機能は3つの短い行で仕事をしますか? –

答えて

3

アイデアが機能n個を適用する高階関数を構築することであるかもしれません。同様回:

from functools import reduce 

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

そして、我々は書くことができます:

def func_mul(f,n=2): 
    def g(x): 
     for _ in range(n): 
      x = f(x) 
     return x 
    return g 

別のオプションは次のようにreduceのいくつかの種類を使用することです

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

私はあなたが機能を必要とする場合ことに同意しますが、一度だけ、これはまだ醜いです。

+1

受賞者!!!!私は 'reduce(d.get、[k] * n)'を使って、 – piRSquared

2

私のぶっきらぼうな解決策は以下のように、単純に関数を作成することです:エラー処理が追加されると

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

、それもあまりきれいに見えますが、私は確実にこれを行うための素晴らしい方法が表示されませんよりはるかに見やすくしながら。

関連する問題