簡體   English   中英

如何修復“TypeError” - 'dict_keys' object 不可下標?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM