【问题标题】:.get() python json file discord bot.get() python json 文件 discord bot
【发布时间】:2018-10-18 19:40:06
【问题描述】:

我有一个 json 文件,其中存储了我的服务器上写入的 id、xp 和级别。 我正在制作一个排行榜来展示我服务器上拥有最多经验的人, 但是出现了一个keyerror: 键错误:'370034734186758173'

有人可以帮我解决这个错误吗?

【问题讨论】:

    标签: python python-3.x bots leaderboard keyerror


    【解决方案1】:

    访问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():) 中,而仅需要加载其内容的行。最好将其余代码取消缩进。

    【讨论】:

      【解决方案2】:

      所以你的朋友可能在后面提到你可以做这样的事情: 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')))
      

      【讨论】:

        猜你喜欢
        • 2018-10-16
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2019-02-22
        • 2021-07-18
        • 2021-08-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多