首页 > 解决方案 > 使用以列表为值的字典,访问时有点困惑

问题描述

因此,我正在使用 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() 函数中,因此客户端对于此示例不是很重要。user 是进行呼叫的当前用户字符串,channelNameList 是用户尝试加入的一个或多个频道的列表。这些渠道可能存在也可能不存在,并且必须在两种情况下处理。“通道”是该程序中所有线程都可以访问的字典,这就是为什么我认为锁定是避免读写错误所必需的。该列表的键是频道的名称,值是一个列表,该列表包含第一个索引中该频道的主题,然后是该频道中的所有用户。

我不知道我是否只是忽略了某些东西,但我几乎可以肯定这个功能将允许我多次在同一个频道中添加同一个用户,并且在我选择将用户附加到之前可能需要另一个条件检查渠道。此检查将用于查看用户是否已经是当前字典中的值列表中的值,该字典由建议的 channelNameList 中的 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 中的列表。

标签: pythonlistdictionaryiteration

解决方案


推荐阅读