如何解决在 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 举报,一经查实,本站将立刻删除。