2016-10-26 12 views
0

pythonで再帰的なitemgetterはありますか?あなたが再帰的なitemgetterのためのPython

d = {'a': (1,2,3), 'b': {1: (5,6)}} 

のような物を持っていると私はd['a']からタプルの最初の要素を取得したいとしましょうか?私がitemgetterと言うことができる限り、レベルは1つのみ、つまりaまたはb、またはその両方を取得します。

itertoolsitemgetterを組み合わせて望みの結果を得る巧妙な方法がありますか?だから、基本的に私が呼び出すことができるようにしたいものを

は、私が「賢い」やり方が気に入らない

from operator import itemgetter 
d = {'a': (1,2), 'b': (4, (5,))} 
itemgetter({'a': 0})(d) --> 1 
itemgetter({'b': 0})(d) --> 4 
itemgetter({'b': {1: 0}})(d) --> 5 

d = {'a': {'b': (1,2,3)}} 
itemgetter({'a': {'b': 2}})(d) --> 3 
+0

OK、そうそこにあるが、この(https://pypi.python.org/pypi/jmespath)何をしているI標準ライブラリの一部ではありません。 –

答えて

2

です。明らかに良いです。

あなたは非常に簡単に添字のリストに沿って繰り返し処理ゲッター書くことができます。

def getter(x, *args): 
    p = x 
    for s in args: 
    p = p[s] 
    return p 

>>> d = {'a': (1,2,3), 'b': {1: (5,6)}} 
>>> getter(d, 'a', 0) 
1 
+0

明示的ではない場合を除いて暗黙的よりも明示的です。すべてが充実しています...基本的にトレードオフです。そして、はい、あなた自身でそれを書くことができます。しかし、コアPythonの中で、数多くの構文砂糖のためにそうすることができます。デコレータ? –

関連する問題