यह बहुत बदसूरत है, लेकिन यह काम करता है:
def set_val(d, keys, val):
reduce(lambda x,y: x[y], keys[:-1], d)[keys[-1]] = val
थोड़ा अधिक पठनीय संस्करण:
def set_val(d, keys, val):
last = keys[-1] # Key we want to set val on
search_keys = keys[:-1] # Keys we need to traverse
reduce(lambda x,y: x[y], search_keys, d)[last] = val
उपयोग:
>>> from collections import defaultdict
>>> D = lambda: defaultdict(D)
>>> d = D()
>>> set_val(d, ['k1', 'k2', 'k3'], "hi")
>>> d
defaultdict(<function <lambda> at 0x7fbd365ac7d0>, {'k1': defaultdict(<function <lambda> at 0x7fbd365ac7d0>, {'k2': defaultdict(<function <lambda> at 0x7fbd365ac7d0>, {'k3': 'hi'})})})
>>> d['k1']['k2']['k3']
'hi'
यह reduce
का उपयोग करता भीतरी सबसे dict का अनुरोध किया (keys[:-1]
) तक पहुँचने के लिए है, तो वांछित मान (output_of_reduce[keys[-1]] = val
) के लिए सूची में अंतिम कुंजी सेट करता है।
ध्यान दें कि पायथन 3 में आपको इसका उपयोग करने के लिए functools import reduce
से एक की आवश्यकता होगी।
def set_val(d, keys, val):
out = d
for k in keys[:-1]:
out = out[k]
out[keys[-1]] = val
अच्छी खोज @ डेव। आपकी खोज अलगो एसओ की संबंधित प्रश्नों की खोज से बेहतर है। – Gerrat
वास्तव में अच्छा लगता है। डुप्लिकेट के रूप में अपना खुद का प्रश्न बंद कर रहा है ... :) – wim