使用字符串作为dict键的Python

2024-09-25 14:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个和这个结构相似的物体

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']"

但是,当尝试使用该键串访问对象时,我会收到KeyError消息

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

对于我在这里要做的事情,有没有合适的语法,或者更好的方法


Tags: 对象方法内容密钥printmyobjkeybkeya
3条回答

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'


通过熊猫有一种方式:

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可能有点过火,但我更喜欢一行解决方案

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

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

这很好,因为现在您可以在此基础上执行eval()

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

输出

valueA3c

相关问题 更多 >