1

リストがあります:

k = ["key1", "subkey2", "subsubkey3"]

d私はそれが有効な辞書であることを確かに知っていd["key1"]["subkey2"]["subsubkey3"]ます。

klistを dict のキーとして変換dして返すにはどうすればよいd[k[0]][k[1]]...ですか?

4

3 に答える 3

9

reduce()で使用してみることができますoperator.getitem

>>> from operator import getitem
>>> 
>>> d = {'key1': {'subkey2': {'subsubkey3': 'value'}}}
>>> k = ["key1", "subkey2", "subsubkey3"]
>>> 
>>> reduce(getitem, k, d)
'value'

Python 3.x では、functools.reduce().


reduce()単純に 2 引数の関数を取り、それをリストの要素に連続して適用し、結果を累積します。ここで使用したオプションの初期化子引数もあります。ドキュメントの状態として、reduce()次とほぼ同等です。

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        try:
            initializer = next(it)
        except StopIteration:
            raise TypeError('reduce() of empty sequence with no initial value')
    accum_value = initializer
    for x in it:
        accum_value = function(accum_value, x)
    return accum_value

この場合、 を渡しているinitializerので、 にはなりませんNone。したがって、次のようになります。

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    accum_value = initializer
    for x in it:
        accum_value = function(accum_value, x)
    return accum_value

functionこの場合はgetitem(a, b)(上記のリンクを参照) であり、単純に を返しますa[b]。さらに、私たちのiterablekであり、私たちのinitializerは ですd。したがって、reduce()上記の呼び出しは次と同等です。

accum_value = d
for x in k:
    accum_value = accum_value[x]
于 2013-10-27T17:20:37.117 に答える
2

これは、良いアイデアと思われる数少ないケースの 1 つreduceです。値に対して同じ操作を連続して適用します。

items = {'foo': {'bar': {'baz': 123}}}
keys = ['foo', 'bar', 'baz']
reduce(lambda d, k: d[k], keys, items) 

これは次と同等です。

items = {'foo': …}
keys = ['foo', …]

result = items
for k in keys:
    # The RHS here is the function passed to reduce(), applied to the 
    # (intermediate) result and the current step in the loop 
    result = items[k] 
于 2013-10-27T17:20:33.670 に答える