我有两个字典
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
我要问的是,是否存在一种更有效的方法来解决此类问题。
答案 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变量使用任何脆弱的命名方案。您可以随便叫他们。这样您就可以给他们起有意义的名字了。