首页 > 解决方案 > 在 discord bot 中构建字典词典

问题描述

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

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

我想创建一个类似的字典

民意调查[股票][用户] = 1

这样,它将保存一个用户字典的字典,该字典以股票符号为键。

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

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

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

用户将输入他们的投票,例如:

!v ZRX

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

!民意调查结果

ZRX:MoonRaccoon,Dontcallmeskaface,TheDirtyTree
链接:MoonRaccoon,TheDirtyTree
XRP:Dontcallmeskaface

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

poll = {'ZRX':{'MoonRaccoon':1,'Dontcallmeskaface':1,'TheDirtyTree':1},'LINK':{'MoonRaccoon':1,'TheDirtyTree':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.
{}

标签: pythondiscord.pyassociative-arrayrepl.it

解决方案


尝试这个

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

推荐阅读