3 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超5個(gè)贊
reduce()
from functools import reduce # forward compatibility for Python 3import operatordef getFromDict(dataDict, mapList): return reduce(operator.getitem, mapList, dataDict)
getFromDict
setInDict()
:
def setInDict(dataDict, mapList, value): getFromDict(dataDict, mapList[:-1])[mapList[-1]] = value
mapList
>>> getFromDict(dataDict, ["a", "r"])1>>> getFromDict(dataDict, ["b", "v", "y"])2>>> setInDict(dataDict, ["b", "v", "w"], 4)>>> import pprint>>> pprint.pprint(dataDict){'a': {'r': 1, 's': 2, 't': 3}, 'b': {'u': 1, 'v': {'w': 4, 'x': 1, 'y': 2, 'z': 3}, 'w': 3}}
get_by_path()
set_by_path()
:
from functools import reduce # forward compatibility for Python 3import operatordef get_by_path(root, items): """Access a nested object in root by item sequence.""" return reduce(operator.getitem, items, root)def set_by_path(root, items, value): """Set a value in a nested object in root by item sequence.""" get_by_path(root, items[:-1])[items[-1]] = value

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
接受的解決方案不會(huì)直接對(duì)python 3起作用-它將需要一個(gè) from functools import reduce
.而且,使用一個(gè) for
循環(huán)。見引用自 移除 reduce()
..使用 functools.reduce()
如果您真的需要它,但是99%的時(shí)間是顯式的 for
循環(huán)更易讀。 接下來,接受的解決方案不會(huì)設(shè)置不存在的嵌套鍵(它返回 KeyError
)-見@EAFIT的答案
def getFromDict(dataDict, mapList): for k in mapList: dataDict = dataDict[k] return dataDict
def nested_set(dic, keys, value): for key in keys[:-1]: dic = dic.setdefault(key, {}) dic[keys[-1]] = value

TA貢獻(xiàn)1795條經(jīng)驗(yàn) 獲得超7個(gè)贊
def nested_set(dic, keys, value): for key in keys[:-1]: dic = dic.setdefault(key, {}) dic[keys[-1]] = value
def keysInDict(dataDict, parent=[]): if not isinstance(dataDict, dict): return [tuple(parent)] else: return reduce(list.__add__, [keysInDict(v,parent+[k]) for k,v in dataDict.items()], [])
def dict_to_df(dataDict): ret = [] for k in keysInDict(dataDict): v = np.array( getFromDict(dataDict, k), ) v = pd.DataFrame(v) v.columns = pd.MultiIndex.from_product(list(k) + [v.columns]) ret.append(v) return reduce(pd.DataFrame.join, ret)
添加回答
舉報(bào)