如何修复“ TypeError”-'dict_keys'对象无法下标?

时间:2019-10-01 11:30:09

标签: python typeerror

我对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中编写此部分的方法,但是我不知道如何使它起作用。

2 个答案:

答案 0 :(得分:2)

好吧,我只是使它工作了:我尝试使用key = data.keys()[0]而不是key = list(data.keys())[0],但似乎可以正常工作。

仍然不确定这是否是正确的方法。 我会接受任何建议,建议和帮助。 非常感谢!

答案 1 :(得分:1)

tl; dr::如果词典中只有一个元素,那么使用list(data.keys())[0]是完全可以的。如果您有多个元素,那么答案是:“取决于...”(因为您将随机获得一个元素)。


对于这种特殊用例,您的将其转换为列表的解决方案对我来说似乎很好。

我只想谈谈为什么为什么无法订阅的原因,这可能会导致您无需依赖[0]就可以找到另一种解决方案。

nb:这将有助于查看从HTTP GET调用返回的JSON文档的示例,以做出更明智的声明。我将继续进行有根据的猜测:

从代码中,我可以肯定地说,GET调用的结果是一个包含对象的JSON文档(换句话说:{}中所包含的内容)。调用.json()方法时,这将转换为Python字典。

Python字典不保证键的顺序。因此,您可以在Python控制台中尝试将这两个实例视为相同(即使顺序不同)。

>>> a = {"a": 10, "b": 20}
>>> b = {"b": 20, "a": 10}
>>> a == b
True

在您的代码中,您使用data.keys()[0],这意味着:“请给我数字的第一把钥匙”。但是因为不能保证订购,所以要求“第一件”的确没有意义。 这就是为什么在Python 3中它不再可以下标的原因。他们禁止这样做以防止代码中出现逻辑错误。

作为一个旁注,我应该说,自Python 3.7起,在某些情况下Python词典中的排序是稳定的 ,但您仍不应依赖这种行为。

如果您100%确保所使用的字典只有一个元素,那么转换为列表并采用第一个元素是完全安全的。如果字典中只有一个元素,也可以使用@rdas提到的next()也可以。如果字典中有多个元素,则不能保证每次调用都为您提供相同的元素,您只会从中获得“任何一个”元素。

此外,如果您控制JSON结构,则可以决定是否要将这些项作为字典或列表返回。后者将保证有序。

如果您可以使用示例JSON文档编辑问题,则可以提供更多信息。