3 回答
![?](http://img1.sycdn.imooc.com/54584cb50001e5b302200220-100-100.jpg)
TA贡献1851条经验 获得超5个赞
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
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
TA贡献1811条经验 获得超5个赞
接受的解决方案不会直接对python 3起作用-它将需要一个 from functools import reduce
.而且,使用一个 for
循环。见引用自 移除 reduce()
..使用 functools.reduce()
如果您真的需要它,但是99%的时间是显式的 for
循环更易读。 接下来,接受的解决方案不会设置不存在的嵌套键(它返回 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
![?](http://img1.sycdn.imooc.com/54584cde0001d19202200220-100-100.jpg)
TA贡献1795条经验 获得超7个赞
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)
添加回答
举报