函数中的变量标识字典名称

时间:2019-02-20 01:54:31

标签: python dictionary

我有两个字典

dictionary_1 = {
    "key 1":"value 1.d1",
    "key 2":"value 2.d1",
    "key 3":"value 3.d1",
}

dictionary_2 = {
    "key 1":"value 1.d2",
    "key 2":"value 2.d2",
    "key 3":"value 3.d2",
}

我想创建一个函数,在其中可以打印函数主体中给出的一些值:

def print_keys(n):
    request = "dictionary_"
    for i in range(n)[1:]:
        request = "dictionary_"+str(i)
        print(request["key 3"])

但是当我尝试使用该函数时,解释器会向我抛出错误,因为该函数中的字典名称是字符串,因此无法找到。有没有一种方法可以强制转换字符串以找到键/值对?

TypeError Traceback (most recent call last)
<ipython-input-32-d31d90b742bc> in <module>()

----> 1 print_keys(3)

<ipython-input-31-6f658f8afacf> in print_keys(n)
      3     for i in range(n)[1:]:
      4         request = "dictionary_"+str(i)
----> 5         print(request["key 3"])

TypeError: string indices must be integers

我要问的是,是否存在一种更有效的方法来解决此类问题。

1 个答案:

答案 0 :(得分:2)

您要执行的操作是使用名称为'dictionary_1'的字符串来引用变量dictionary_1。这是行不通的。

可以使用eval函数来实现。像这样

def print_keys(n):
    request = "dictionary_"
    for i in range(1, n + 1):
        request = eval("dictionary_"+str(i))
        print(request["key 3"])

如果该变量存在,它将字符串转换为变量。

这不是一种很好的操作方法。eval是一个潜在的安全漏洞,通常它的必要性是不良设计的标志。在这种情况下,print_keys函数与代码中其他位置的某些全局dict的名称之间存在耦合。

相反,我建议最好的方法是传递要处理的dict个列表,并

def print_keys2(dl, key):
    for dct in dl:
        print(dct[key])

使用方式

print_keys2([dictionary_1, dictionary_2], 'key 3')

请注意,您不需要为dict变量使用任何脆弱的命名方案。您可以随便叫他们。这样您就可以给他们起有意义的名字了。