使用以列表为值的字典,访问时有点困惑

2024-10-03 23:26:42 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我在一个IRC聊天服务器上工作,我有一个功能,我试图允许用户使用join命令加入一个频道或频道列表,并创建那些不存在的频道。我还尝试实现一个PART命令,该命令具有类似的结构和参数,但如果在列表中找到用户,则会将其从列表中删除。我已经知道如何使用字典而不是列表来实现这一点,这降低了代码的复杂性,但有一部分很难理解,那就是如何根据上面列出的原因检查字典的列表值

作为一个小的补充,如果我能够找到如何遍历内部值字典列表,我觉得我可以很好地处理PART命令的错误。这些可能包括如果用户试图从他们不在的频道退出,或者从不存在的频道退出

def join(client, user, channelNameList):
    with lock:
        for channelName in channelNameList:
            if channels[channelName] != None:
                #need some way to check through the dictionary values which
                #are a list of strings containing users
                channels[channelName].append(user)
            else:
                createChannel(channelName, user)

这是我正在使用的当前函数。为了澄清一些事情,客户机是用于发送错误代码或回复的客户机套接字地址,其中只有createChannel()函数提供了这些地址,因此客户机在本例中并不重要。用户是进行呼叫的当前用户字符串,channelNameList是用户尝试加入的一个或多个频道的列表。这些渠道可能存在,也可能不存在,在这两种情况下都必须处理。“通道”是这个程序中所有线程都可以访问的字典,这就是为什么我认为锁是避免读写错误所必需的。该列表的键是频道的名称,值是由该频道的主题在第一个索引中组成的列表,后跟该频道中的所有用户

我不知道我是否忽略了什么,但我几乎可以肯定,这个函数将允许我将同一用户添加到同一频道多次,在我选择将用户添加到频道之前,可能需要进行另一个条件检查。此检查将用于查看用户是否已经是由建议的channelName列表中的channelName给定的当前字典中的值列表中的值

更新:

def join(client, user, channelNameList):
    with lock:
        for channelName in channelNameList:
            if channelName in channels:
                if any(x == user for x in channels[channelName]) == True:
                    pass
                else:
                    channels[channelName].append(user)
            else:
                createChannel(channelName, user)

所以我觉得我找到了一个解决办法。目前我很难进行测试,但我希望得到一个更好的解决方案的建议,该解决方案允许我与字典的值进行更多的交互,比如某种形式的for循环,它检查当前字典中的所有列表值。原因是如果我当前的解决方案有效,我意识到它不能解决我的下一个问题,那就是我的PART命令,它将遵循几乎完全相同的逻辑,但是当我发现用户处于存在的通道中时,我应该删除它们。这显然需要单独访问这些值,而且我似乎找不到任何涉及处理带有字符串的键值对的列表(python中的list)语法的示例


Tags: 用户in命令列表forif字典频道