は私の辞書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
は私の辞書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個を適用する高階関数を構築することであるかもしれません。同様回:
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)
私はあなたが機能を必要とする場合ことに同意しますが、一度だけ、これはまだ醜いです。
受賞者!!!!私は 'reduce(d.get、[k] * n)'を使って、 – piRSquared
私のぶっきらぼうな解決策は以下のように、単純に関数を作成することです:エラー処理が追加されると
def walk(dict, start, iters):
if iters <= 0:
return start
return walk(dict, dict[start], iters-1)
、それもあまりきれいに見えますが、私は確実にこれを行うための素晴らしい方法が表示されませんよりはるかに見やすくしながら。
これが順序付き辞書であれば、キーと値のペアを歩くだけでいいですか? – EdChum
あなたは何を達成しようとしていますか? – canyon289
あなたの機能は3つの短い行で仕事をしますか? –