2017-08-10 117 views
1

我想知道是否有将字符串转换为字典位置的预构建方式。我认为示例代码将是最简单的解释我想要做的事情。将字符串转换为Python中的字典位置

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 
+1

你应该考虑重新设计你的代码。这是糟糕的设计。 –

+0

这里有一些非常残暴的答案。不要使用'eval',而是重新设计代码,以便通过传递int来访问数据。 – skrx

回答

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

这是什么东西做的是在功能main范围评估串response['users'][1]['id']

无论使用情况如何,使用eval都不推荐,因为您可以通过Google进行多种选择。我会试着重构你的代码,以便不需要使用eval

+0

为什么这是downvoted? – JoshuaRLi

+1

OP提出了错误的问题(没有意识到),这就是你已经回答的问题。他/她真正想要的是了解如何从嵌套数据结构中检索数据;在这种情况下,如何搜索包含正确userId属性的元素的列表 – jpaugh

+0

否...OP在其示例代码中嵌套访问符号的事实意味着他意识到了这一点。 – JoshuaRLi

0

使用ast.literal_eval

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

这不是有效的Python语法。 –

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

0

这是一种重构代码的方法。该函数现在只需要响应和索引并打印用户列表的相应元素。

response = { 
    "users": [ 
     {"id": 1, "name": "Joe"}, 
     {"id": 2, "name": "Bob"} 
     ] 
    } 

def locate_user_id(response, user_id): 
    print(response["users"][user_id]["id"]) 

locate_user_id(response, 1) 

如果你真的想获得具有传入ID号的用户,你可以遍历用户列表:

def locate_user_id(response, user_id): 
    for user in response["users"]: 
     if user["id"] == user_id: 
      print(user) 

另外,如果你能重新组织数据,然后你可以尝试这样的事情:

response = { 
    "users": { 
     1: "Joe", 
     2: "Bob", 
     } 
    }