Python 3 更改 for 循环中字典键的值不起作用

标签 python for-loop dictionary python-3.x key-value

我的 python 3 代码没有按预期工作:

def addFunc(x,y):
    print (x+y)

def subABC(x,y,z):
    print (x-y-z)

def doublePower(base,exp):
    print(2*base**exp)

def  RootFunc(inputDict):
    for k,v in inputDict.items():
        if v[0]==1:
            d[k] = addFunc(*v[1:])
        elif v[0] ==2:
            d[k] = subABC(*v[1:])
        elif  v[0]==3:
            d[k] = doublePower(*v[1:])


d={"s1_7":[1,5,2],"d1_6":[2,12,3,3],"e1_3200":[3,40,2],"s2_13":[1,6,7],"d2_30":[2,42,2,10]}
RootFunc(d)

#test to make sure key var assignment works
print(d)

我得到:

{'d2_30': None, 's2_13': None, 's1_7': None, 'e1_3200': None, 'd1_6': None}

我预计:

{'d2_30': 30, 's2_13': 13, 's1_7': 7, 'e1_3200': 3200, 'd1_6': 6}

怎么了?

半相关:我知道字典是无序的,但是 python 选择这个顺序有什么原因吗?它会通过随机发生器运行 key 吗?

最佳答案

print 不返回值。它返回 None,因此每次调用函数时,它们都会打印到标准输出并返回 None。尝试将所有 print 语句更改为 return,如下所示:

 def addFunc(x,y):
     return x+y

这会将值 x+y 返回给调用该函数的任何内容。

你的代码的另一个问题(除非你打算这样做)是你定义了一个字典 d 然后当你定义你的函数时,你正在处理这个字典 d 而不是“输入”的字典:

def  RootFunc(inputDict):
    for k,v in inputDict.items():
        if v[0]==1:
            d[k] = addFunc(*v[1:])

您是否计划始终更改 d您正在迭代的字典 inputDict

可能还有其他问题(例如,在您的函数中接受可变数量的参数),但最好一次解决一个问题。


函数附加说明:

这里有一些伪代码试图表达函数的常用方式:

def sample_function(some_data):
     modified_data = []
     for element in some_data:
          do some processing
          add processed crap to modified_data
     return modified_data

函数被认为是“黑匣子”,这意味着您可以构建它们,以便可以将一些数据转储到它们中,并且它们总是做同样的事情,您可以一遍又一遍地调用它们。它们将返回 值或yield 值或更新某些值或属性或其他东西(后者称为“副作用”)。目前,只需注意 return 语句。

另一个有趣的事情是函数有“范围”,这意味着当我只是用参数的假名定义它时,我实际上不必有一个名为“some_data”的变量。我可以将任何我想要的传递给函数,但在函数内部我可以引用假名称并创建其他仅在函数上下文中才真正重要的变量。

现在,如果我们运行上面的函数,它将继续处理数据:

 sample_function(my_data_set)

但这通常有点毫无意义,因为该函数应该返回一些东西,而我没有对它返回的东西任何事情。我应该做的是将函数的值及其参数分配给某个容器,这样我就可以保留处理过的信息。

my_modified_data = sample_function(my_data_set)

这是一种非常常见的函数使用方式,您可能会再次看到它。


一种解决问题的简单方法:

考虑到所有这些,这里有一种方法可以解决您的问题,该方法来自一个非常常见的编程范例:

def  RootFunc(inputDict):
    temp_dict = {}
    for k,v in inputDict.items():
        if v[0]==1:
            temp_dict[k] = addFunc(*v[1:])
        elif v[0] ==2:
            temp_dict[k] = subABC(*v[1:])
        elif  v[0]==3:
            temp_dict[k] = doublePower(*v[1:])
    return temp_dict


  inputDict={"s1_7":[1,5,2],"d1_6":[2,12,3,3],"e1_3200":[3,40,2],"s2_13":[1,6,7],"d2_30"[2,42,2,10]}
  final_dict = RootFunc(inputDict)

关于Python 3 更改 for 循环中字典键的值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18050737/

相关文章:

python - 将字典转储到 YAML 文件,同时保留顺序

python - Matplotlib 和 Networkx - 绘制自循环节点

python : Matching a custom date format in a string

python - 为什么我的 for 循环会跳过列表中的一个元素?

javascript - 如何使用用户定义的值来增加 Javascript 中的值

python - 如何用python去除元组列表?

python - 将配对数据 append 到列表的最快方法

javascript - jQuery 和 jqGrid - For ...每个循环提取数据

c - for 循环中的值不随增量变化?

python - 用零或字符串替换字典值中的所有整数