![](/img/trans.png)
[英]NLTK python error: "TypeError: 'dict_keys' object is not subscriptable"
[英]How to fix “TypeError” - 'dict_keys' object is not subscriptable?
我對 Python 完全陌生,我只是在練習和“復制”一些 github 代碼。 這樣做時,我意識到我使用的是最新版本的 Python 並且視頻中的人使用的是 Python 2.7,所以他使用的代碼與我的不兼容。 請幫助我如何重寫代碼。
def add_friend(self,friend_id):
check_req = requests.get('https://gift-f06e4.firebaseio.com/.json?orderBy="my_friend_id"&equalTo=' + friend_id)
data = check_req.json()
print(check_req.ok)
print(check_req.json())
if data == {}:
self.root.ids['add_friend_screen'].ids['add_friend_label'].text = "Invalid friend ID"
else:
key = data.keys()[0]
new_friend_id = data[key]['my_friend_id']
print('New friend id is', new_friend_id)
問題出現在這一行:
key = data.keys()[0]
我知道這不是我應該在 Python 3 中寫這部分的方式,但我不知道如何使它工作。
好吧,我剛剛讓它工作:我嘗試key = list(data.keys())[0]
而不是key = data.keys()[0]
] ,它似乎正在工作。
仍然不確定這是否是正確的方法。 我會接受任何建議,建議,幫助。 非常感謝!
tl;dr:如果字典中只有一個元素,那么使用list(data.keys())[0]
就可以了。 如果您有多個元素,那么答案是:“這取決於...”(因為您將隨機獲得一個元素)。
對於這個特定的用例,您將其轉換為列表的解決方案對我來說似乎很好。
我只是想離題一點,為什么這是不可訂閱的,這可能會導致您在不依賴[0]
的情況下找到另一個解決方案。
注意:查看從 HTTP GET 調用返回的 JSON 文檔的示例以做出更明智的聲明會有所幫助。 我將繼續進行明智的猜測:
從代碼中,我可以肯定地說 GET 調用的結果是一個 JSON 文檔,其中包含一個 object (換句話說:包含在{
和}
中的東西)。 調用 .json .json()
方法時,這將轉換為 Python 字典。
Python 字典沒有保證鍵的順序。 所以這兩個實例被認為是相同的(即使順序不同),您可以在 Python 控制台中嘗試:
>>> a = {"a": 10, "b": 20}
>>> b = {"b": 20, "a": 10}
>>> a == b
True
在您的代碼中,您使用data.keys()[0]
這意味着:“給我字典的第一個鍵”。 但是因為不能保證訂購,所以要求“第一個”項目並沒有真正的意義。 這就是為什么在 Python 3 中它不再是 subscriptable 的原因。 他們禁止它以防止代碼中的邏輯錯誤。
作為旁注,我應該說,由於 Python 3.7,Python 字典中的排序在某些條件下是穩定的,但您仍然不應該依賴這種行為。
如果您 100% 確定您使用的字典只有一個元素,那么轉換為列表並獲取第一個元素是完全安全的。 或者,如果字典中只有一個元素,則使用 @rdas 提到的next()
也可以。 如果字典有多個元素,則不能保證每次調用都為您提供相同的元素,您只會從中獲得“任何一個”元素。
此外,如果您控制 JSON 結構,您可以決定是否要將項目作為字典或列表返回。 后者將有保證的排序。
如果您可以使用示例 JSON 文檔編輯您的問題,我可以提供更多信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.