在Python中将字符串转换为字典位置

时间:2017-08-10 16:27:02

标签: python string dictionary

我正在试图弄清楚是否存在将字符串转换为字典位置的预建方式。我认为示例代码最容易解释我正在尝试做什么。

def main(locate_user_id):
    response = {
        "users": [{
            "id": 1,
            "name": "Joe"
        }, {
            "id": 2,
            "name": "Bob"
        }]
    }
    print(response)
    print (locate_user_id)
    print (response[locate_user_id])

if __name__ == "__main__":
    main("users[1]['id']")

目前的输出是:

{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]}
users[1]['id']
Traceback (most recent call last):
  File "test_dict.py", line 17, in <module>
    main("users[1]['id']")
  File "test_dict.py", line 14, in main
    print (response[locate_user_id])
KeyError: "users[1]['id']"

我正在寻找一种能够输出这个的解决方案:

{'users': [{'id': 1, 'name': 'Joe'}, {'id': 2, 'name': 'Bob'}]}
users[1]['id']
2 // the id of the user referenced above

4 个答案:

答案 0 :(得分:0)

使用ast.literal_eval

>>> import ast
>>> ast.literal_eval{PUT YOUR LIST HERE}

答案 1 :(得分:0)

我认为这样做会有所帮助。有点脏,但它有效!

def main(locate_user_id):
    response = {
        "users": [{
            "id": 1,
            "name": "Joe"
        }, {
            "id": 2,
            "name": "Bob"
        }]
    }
    print(response)
    print(locate_user_id)

    keys = locate_user_id.replace(']','').split('[')
    keys[0] = '"' + keys[0] + '"'
    eval_str = '[' + ']['.join(keys) + ']'

    print(eval(str(response) + eval_str))


if __name__ == "__main__":
    main("users[1]['id']")

答案 2 :(得分:0)

不使用eval,只需略微修改输入,就可以使用能够评估下标访问权限的str.format来实现您想要的效果,而不必使用邪恶的eval

def main(locate_user_id):
    response = {
        "users": [{
            "id": 1,
            "name": "Joe"
        }, {
            "id": 2,
            "name": "Bob"
        }]
    }

    print(("{"+locate_user_id+"}").format(response))


if __name__ == "__main__":
    main("[users][1][id]")  # instead of "users[1]['id']"

结果:2

答案 3 :(得分:-2)

字符串是一个字符串。您需要Python解释器才能理解Python语法。要在脚本范围内调用解释器,可以使用eval

您需要对脚本进行轻微修改,eval才能按您希望的方式工作:

def main(locate_user_id):
    response = {
        "users": [{
            "id": 1,
            "name": "Joe"
        }, {
            "id": 2,
            "name": "Bob"
        }]
    }
    print(eval('response' + locate_user_id))

if __name__ == "__main__":
    main("['users'][1]['id']")

这是在评估函数response['users'][1]['id']范围内的字符串main

无论使用何种用例,都不建议使用eval,原因可能是Google。我会尝试重构您的代码,以便不必使用eval