【问题标题】:Using for loop to create a dictionary by function使用for循环按函数创建字典
【发布时间】:2021-10-27 21:21:08
【问题描述】:

我设法使用 for 循环来创建一个嵌套函数。这是我的代码:

sub="01"
locals()['MSC' + sub] = {}
seeds = ["aHPC", "pHPC", "FPl", "FPm", "ERC", "PHC", "PRC", "46"] 
masks = ["whole", "ERC", "PFl", "FPm"]
hemispheres = ["R", "L"] 
sessions = ["01", "02"] 
for hemi in hemispheres:
    for seed in seeds:
        for mask in masks:
            current_pair = hemi + "_" + seed + "_" + mask
            locals()['MSC' + sub][current_pair] = {}
            for ses in sessions:
                input_dir = "/1D_fc/" + sub + "_" + ses + "/"
                mean_fn = input_dir + "R.Fim." + hemi + "_" + seed + "_" + mask + ".nii.gz"  
                try:
                    mean_brain=nib.load(mean_fn)
                    #control_brain=nib.load(control_fn)
                except:
                    "couldn't load"
                
                mean_data = mean_brain.get_data()  # 3D array; get the dimensions; type(mean_control_data)

                meanDataVector = mean_data.ravel()
                locals()['MSC'+sub][current_pair][ses] = meanDataVector

当将所有这些代码放入一个函数中时,该函数请求子变量作为字符串。它没有返回我需要的嵌套字典。

def CreateDict(sub):
    subject=sub
    locals()['MSC' + sub] = {}
    seeds = ["aHPC", "pHPC", "FPl", "FPm", "ERC", "PHC", "PRC", "46"] 
    masks = ["whole", "ERC", "PFl", "FPm"] 
    hemispheres = ["R", "L"] 
    sessions = ["01", "02"] 
    for hemi in hemispheres:
        for seed in seeds:
            for mask in masks:
                current_pair = hemi + "_" + seed + "_" + mask
                locals()['MSC' + sub][current_pair] = {}
                for ses in sessions:
                    input_dir = "/1D_fc/" + sub + "_" + ses + "/"
                    mean_fn = input_dir + "R.Fim." + hemi + "_" + seed + "_" + mask + ".nii.gz"  
                    try:
                        mean_brain=nib.load(mean_fn)
                        
                    except:
                        "couldn't load"
                    
                    mean_data = mean_brain.get_data()  # 3D array; get the dimensions; type(mean_control_data)
                    
                    meanDataVector = mean_data.ravel()
                    locals()['MSC'+sub][current_pair][ses] = meanDataVector
    return locals()['MSC' + subject]
sub="01"
CreateDict(sub)

函数没有错误信息。

对此有何见解?谢谢!

【问题讨论】:

  • 在此处使用locals() 是对该功能的滥用,请考虑改用字典。
  • locals() 的使用是您问题的很大一部分。请记住,函数中的 locals() 实际上是函数的本地函数。当函数退出时,locals() 中的所有内容都会消失,因此不会有 MSC01 变量。只需在函数中创建一个局部变量并返回该局部变量。如果调用者想存储它,调用者会存储它。
  • 你好蒂姆,这很有帮助!

标签: python function dictionary


【解决方案1】:

不要像那样使用locals,只需在您的函数中创建字典return,然后将其分配给调用站点的变量。像这样的:

def create_dict(sub):
    data = {} # no need for locals
    # ...
    return data

msc01 = create_dict('01')
# proceed to use msc01

如果您想为不同的sub 值创建和使用多个字典,请考虑使用另一个字典:

msc = {}
for value in ('01', '02', '03'): 
    msc[value] = create_dict(value)

# now you have msc['01'] etc.

【讨论】:

    猜你喜欢
    • 2022-01-13
    • 2023-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 2019-03-29
    • 1970-01-01
    • 2020-06-20
    • 2019-09-30
    相关资源
    最近更新 更多