Python使用字符串作为字典键。

3

我有一个与此类似结构的对象

myObj = {
    "subObj1":{"keyA":"valueA1"},
    "subObj2":{"keyA":"valueA2","keyB":"valueB2"},
    "subObj3":{"keyA":"valueA3","keyB":"valueB3", "keyC":{"keyA":"valueA3c"}},
}

通常情况下,我可以通过类似这样的方式访问此对象的内容。
print(myObj['subObj1']['keyA'])
print(myObj['subObj2']['keyB'])
print(myObj['subObj3']['keyC']['keyA'])

这会返回相应的值

alueA1
valueB2
valueA3c

我需要一种方式,可以根据外部配置文件中的键来访问对象的内容。该文件中的键看起来会像这样:

"subObj3.keyC.keyA"

我可以将该键转换为与我通常访问对象相似的东西。
keyString="['subObj3']['keyC']['keyA']"

但是当尝试使用该keyString访问对象时,会收到KeyError错误信息。

print(myObj[keyString])
KeyError: "['subObj3']['keyC']['keyA']"

这里有一个合适的语法或更好的方法来实现我想做的事情吗?

3个回答

2

以下是使用pandas的一种方法:

import pandas as pd
myObj = {
    "subObj1": {"keyA": "valueA1"},
    "subObj2": {"keyA": "valueA2", "keyB": "valueB2"},
    "subObj3": {"keyA": "valueA3", "keyB": "valueB3", "keyC": {"keyA": "valueA3c"}},
}
normalized_myObj = pd.json_normalize(myObj, sep='.').to_dict('records')

输出:

[{'subObj1.keyA': 'valueA1',
  'subObj2.keyA': 'valueA2',
  'subObj2.keyB': 'valueB2',
  'subObj3.keyA': 'valueA3',
  'subObj3.keyB': 'valueB3',
  'subObj3.keyC.keyA': 'valueA3c'}]

注意:使用pandas可能有些过头,但这是我喜欢的一行代码解决方案。


1
Nk03的解决方案确实是一种强大的方法... 作为一个更简单的选择,考虑这个:
def get_value(s):
    keys = s.split(".")
    d = myObj
    for k in keys: d = d[k] # will go a step deeper for each provided key
    return d

get_value("subObj3.keyC.keyA")
>> 'valueA3c'

get_value("subObj1.keyA")
>> 'valueA1'

get_value("subObj2.keyB")
>> 'valueB2'



-1

你说过你可以将字符串转换为

keyString="['subObj3']['keyC']['keyA']"

这很好,因为现在你可以对此执行eval()

string = ""
for i in "subObj3.keyC.keyA".split('.'):
    string += f"['{i}']"
print(eval(f'myObj{string}'))

输出

valueA3c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接