リストがあります:
k = ["key1", "subkey2", "subsubkey3"]
d
私はそれが有効な辞書であることを確かに知っていd["key1"]["subkey2"]["subsubkey3"]
ます。
k
listを dict のキーとして変換d
して返すにはどうすればよいd[k[0]][k[1]]...
ですか?
リストがあります:
k = ["key1", "subkey2", "subsubkey3"]
d
私はそれが有効な辞書であることを確かに知っていd["key1"]["subkey2"]["subsubkey3"]
ます。
k
listを dict のキーとして変換d
して返すにはどうすればよいd[k[0]][k[1]]...
ですか?
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]
。さらに、私たちのiterable
はk
であり、私たちのinitializer
は ですd
。したがって、reduce()
上記の呼び出しは次と同等です。
accum_value = d
for x in k:
accum_value = accum_value[x]
これは、良いアイデアと思われる数少ないケースの 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]