我对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中编写此部分的方法,但是我不知道如何使它起作用。
答案 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文档编辑问题,则可以提供更多信息。