2017-08-10 97 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", 
     } 
    } 
相關問題