避免重复代码循环嵌套字典的不同深度的优雅方法?

时间:2016-05-20 10:40:19

标签: python dictionary nested code-duplication

我有一个深度为3的嵌套字典datadata[key1]是字典,data[key1][key2]也是字典,data[key1][key2][key3]是数字。

我需要循环遍历不同的深度,目前我使用多个共享大量代码的函数来实现。我在下面的示例中标记了仅有的3行不同。如何避免代码重复?

def plot_measured_vs_fixed(data, noise, metric, aois, nfig):
    n_aois = len(aois)
    plt.figure(nfig, figsize=(FIGURE_SIZE*n_aois,FIGURE_SIZE)).clf()
    tilts = ["measured","fixed"]  # <<<<<<<<<<<<<< HERE!
    ymin, ymax = np.inf, -np.inf
    for i in range(n_aois):
        if i == 0:
            ax = ax0 = plt.subplot(1,n_aois,1)
        else:
            ax = plt.subplot(1,n_aois,i+1, sharey=ax0)
            plt.setp(ax.get_yticklabels(), visible=False)
        aoi = aois[i]
        values = [data[tilt][aoi+metric][noise] for tilt in tilts] # <<<<<<<<<<<<<< HERE!
        barplot(tilts, values, aoi) # <<<<<<<<<<<<<< HERE!
        vmin, vmax = min(values), max(values)
        if ymin > vmin:
            ymin = vmin
        if ymax < vmax:
            ymax = vmax
    d = (ymax - ymin) / 4
    ymin, ymax = ymin - d, ymax + d
    plt.ylabel(metric+" (%)", size=20)
    plt.ylim(ymin,ymax)
    plt.title(metric)
    plt.tight_layout()

def plot_base_vs_worst(data, tilt, metric, aois, nfig):
    n_aois = len(aois)
    plt.figure(nfig, figsize=(FIGURE_SIZE*n_aois,FIGURE_SIZE)).clf()
    noises = ["base","worst"] # <<<<<<<<<<<<<< HERE!
    ymin, ymax = np.inf, -np.inf
    for i in range(n_aois):
        if i == 0:
            ax = ax0 = plt.subplot(1,n_aois,1)
        else:
            ax = plt.subplot(1,n_aois,i+1, sharey=ax0)
            plt.setp(ax.get_yticklabels(), visible=False)
        aoi = aois[i]
        values = [data[tilt][aoi+metric][noise] for noise in noises] # <<<<<<<<<<<<<< HERE!
        barplot(noises, values, aoi) # <<<<<<<<<<<<<< HERE!
        vmin, vmax = min(values), max(values)
        if ymin > vmin:
            ymin = vmin
        if ymax < vmax:
            ymax = vmax
    d = (ymax - ymin) / 4
    ymin, ymax = ymin - d, ymax + d
    plt.ylim(ymin,ymax)
    plt.ylabel(metric+" (%)", size=20)
    plt.title(metric)
    plt.tight_layout()

1 个答案:

答案 0 :(得分:1)

这是python。您可以定义功能,以便可以指定倾斜和噪声。 根据设置的内容,您可以使用一个参数(和另一个参数列表)或另一个参数。快速草绘如何看起来:

def plot_index_diff(data, metric, aois, nfig, noise="", tilt=""):
    ...
    noises = ["base","worst"]
    tilts = ["measured","fixed"]
    if tilt != "":
        values = [data[tilt][aoi+metric][name] for name in noises]
        barplot(noises, values, aoi)
    if noise != "":
        values = [data[name][aoi+metric][noise] for name in noises]
        barplot(tilts, values, aoi)
    ...

如果您稍微重新设计界面,事情会变得更加容易。