.get() python json 文件不和谐机器人
.get() python json file discord bot
我有一个 json 文件,用于存储在我的服务器上写入的用户的 ID、XP 和级别。
我正在制作排行榜以显示在我的服务器上拥有最多 xp 的人,
但是会出现键盘错误:
KeyError: '370034734186758173'
有人可以帮我解决这个错误吗?
所以马上你的朋友可能指的是你可以做这样的事情:
lb = list(map(lambda m: (m, users.get(m.id, {'xp': 0}).get('xp')), message.server.members)]
但至于为什么会这样,您应该先阅读文档:https://docs.python.org/2/library/stdtypes.html#dict.get
但我认为您可能更喜欢对您正在做的事情进行列表理解:
https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions
例如,您可以像这样重写获取 lb
变量的方式:
lb = [(member, users[member.id].get('xp')) for member in message.server.members if member.id in users]
相当于这样写:
lb = []
for member in message.server.members:
# Check if the member is in your users list
if member.id in users:
lb.append((member, users[member.id].get('xp')))
访问 users
词典时将使用 .get
。您可以将第二个参数作为默认值添加到调用中(以防您找不到这样的键),在第一次调用中您应该输出一个空字典,这样第二个 .get
就不会失败.
lb = list(map(lambda m: (m, users.get(m.id, {}).get("xp"), message.server.members))
既然你正在用它制作一个列表,你可能还想尝试(更像 pythonic 的)列表理解(并不是说你的行有任何问题):
lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members ]
请注意,当 get 在字典中找不到键时,这两种方法都会 return 一个 None 项,您可以使用列表中的 if
子句省略它理解:
lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members if m.id in users ]
作为旁注,我要补充一点,您已将所有内容都包含在上下文管理器子句 (with open():
) 中,而只有加载其内容的行是必需的。最好取消其余代码的缩进。
我有一个 json 文件,用于存储在我的服务器上写入的用户的 ID、XP 和级别。 我正在制作排行榜以显示在我的服务器上拥有最多 xp 的人, 但是会出现键盘错误: KeyError: '370034734186758173'
有人可以帮我解决这个错误吗?
所以马上你的朋友可能指的是你可以做这样的事情:
lb = list(map(lambda m: (m, users.get(m.id, {'xp': 0}).get('xp')), message.server.members)]
但至于为什么会这样,您应该先阅读文档:https://docs.python.org/2/library/stdtypes.html#dict.get
但我认为您可能更喜欢对您正在做的事情进行列表理解: https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions
例如,您可以像这样重写获取 lb
变量的方式:
lb = [(member, users[member.id].get('xp')) for member in message.server.members if member.id in users]
相当于这样写:
lb = []
for member in message.server.members:
# Check if the member is in your users list
if member.id in users:
lb.append((member, users[member.id].get('xp')))
访问 users
词典时将使用 .get
。您可以将第二个参数作为默认值添加到调用中(以防您找不到这样的键),在第一次调用中您应该输出一个空字典,这样第二个 .get
就不会失败.
lb = list(map(lambda m: (m, users.get(m.id, {}).get("xp"), message.server.members))
既然你正在用它制作一个列表,你可能还想尝试(更像 pythonic 的)列表理解(并不是说你的行有任何问题):
lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members ]
请注意,当 get 在字典中找不到键时,这两种方法都会 return 一个 None 项,您可以使用列表中的 if
子句省略它理解:
lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members if m.id in users ]
作为旁注,我要补充一点,您已将所有内容都包含在上下文管理器子句 (with open():
) 中,而只有加载其内容的行是必需的。最好取消其余代码的缩进。