微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 discord bot 中构建字典字典

如何解决在 discord bot 中构建字典字典

我正在尝试创建一个简单的机器人来统计对股票代码评论的请求。

有一小群交易者请求 TA 专家分析图表。这将作为一个不和谐的机器人运行。

我想创建一个类似的字典

民意调查[ticker][user] = 1

通过这种方式,它将保存一个用户字典,其中包含关闭股票代码用户字典。

这样代码请求就不能重复,用户也不能两次为同一个代码投票。

然后我会将其保存在 Repl.it 上的密钥库中

这是我使用 python 的第二天,虽然我之前用其他语言编写过代码,但很多年没有了..只是想确保我走在正确的轨道上。

用户将像这样输入他们的投票:

!v ZRX

最终我们希望看到如下结果:

!投票结果

ZRX:MoonRaccoon、Dontcallmeskaface、TheDirtyTree
链接:MoonRaccoon,TheDirtyTree
XRP:不要调用meskaface

所以我认为支持这一点的最佳数据结构是这样的:

poll = {'ZRX' : {'MoonRaccoon' : 1,'Dontcallmeskaface' : 1,'TheDirtyTree' : 1},'LINK' : {'MoonRaccoon' : 1,'XRP ' : {'Dontcallmeskaface'} : 1}

这有意义吗?

client = discord.Client()

def update_poll(ticker,requestor):
  Vote = {ticker : {requestor : 1}}
  if "poll" in db.keys():
    db["poll"].setdefault(ticker,{})[requestor] = 1
  else:
    db["poll"] = Vote


@client.event
async def on_ready():
  print('We have logged in as {0.user}'.format(client))

@client.event
async def on_message(message):
  if message.author == client.user:
    return

  msg = message.content
 
  if msg.startswith("!v"):
    ticker = msg.split("!v ",1)[1]
    author = str(message.author).split("#",1)[0]
    update_poll(ticker,author)
     
    await message.channel.send("Vote for " + ticker + " by " + author + " added.")
    await message.channel.send(db["poll"])

  if msg.startswith("!clear"):
    
    db["poll"] = {}
    
    await message.channel.send("poll cleared")
    await message.channel.send(db["poll"])


我设置了 db = {} 并且现在似乎没有为其添加任何选票。

无论我投票给谁,数据结构的每次输出都是相同的。 :

!v MATIC

Vote for MATIC by MoonRaccoon added.
{}

解决方法

试试这个

def update_poll(ticker,requestor):
  vote = {ticker : {requestor : 1}}
  if "poll" in db.keys():
    db["poll"].setdefault(ticker,{})[requestor] = 1
  else:
    db["poll"] = vote

编辑:以上答案假设您使用的是内置字典 不确定 replit.db 是否有 setdefault 方法。试试这个:-

def update_poll(ticker,requestor):
  vote = {ticker : {requestor : 1}}
  if "poll" in db.keys():
    if ticker in db["poll"].keys():
      db["poll"][ticker][requestor] = 1
    else:
      db["poll"][ticker] = {}
      db["poll"][ticker][requestor] = 1
  else:
    db["poll"] = vote
,

为了分配 db["poll"][ticket][requestor],它尝试首先获取 db["poll"][ticker] 但没有找到它,所以它会引发错误。

您需要在分配 db["poll"][ticker] 之前创建 db["poll"][ticker][requestor]

作为旁注,有两种更简洁的方法可以实现您想要做的事情:您可能想要阅读 defaultdict 或使用 Pydantic 或类似方法创建自定义数据类对象。

,

您可以使用 Nested defaultdict of defaultdict 中指定的嵌套 defaultdict。

from collections import defaultdict

my_dict = defaultdict(lambda: defaultdict(dict))

my_dict['poll']['ZRX']['my user name']=1

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。