3 回答
TA贡献1851条经验 获得超5个赞
reduce()
from functools import reduce # forward compatibility for Python 3import operatordef getFromDict(dataDict, mapList): return reduce(operator.getitem, mapList, dataDict)
getFromDictsetInDict():
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贡献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]] = valueTA贡献1795条经验 获得超7个赞
def nested_set(dic, keys, value):
for key in keys[:-1]:
dic = dic.setdefault(key, {})
dic[keys[-1]] = valuedef 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)
添加回答
举报
