【发布时间】:2018-10-18 19:40:06
【问题描述】:
我有一个 json 文件,其中存储了我的服务器上写入的 id、xp 和级别。 我正在制作一个排行榜来展示我服务器上拥有最多经验的人, 但是出现了一个keyerror: 键错误:'370034734186758173'
有人可以帮我解决这个错误吗?
【问题讨论】:
标签: python python-3.x bots leaderboard keyerror
我有一个 json 文件,其中存储了我的服务器上写入的 id、xp 和级别。 我正在制作一个排行榜来展示我服务器上拥有最多经验的人, 但是出现了一个keyerror: 键错误:'370034734186758173'
有人可以帮我解决这个错误吗?
【问题讨论】:
标签: python python-3.x bots leaderboard keyerror
访问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 在字典中找不到 Key 时,这两种方法都将返回 None 项,您可以在列表推导中使用 if 子句省略它:
lb = [ (m, users.get(m.id, {}).get("xp") for m in message.server.members if m.id in users ]
作为旁注,我要补充一点,您已将所有内容都包含在上下文管理器子句 (with open():) 中,而仅需要加载其内容的行。最好将其余代码取消缩进。
【讨论】:
所以你的朋友可能在后面提到你可以做这样的事情:
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')))
【讨论】: