使用多个字典管理数据,提升效率和便捷性

70 阅读2分钟

1.在开发一个小型的服务器型应用时,需要管理大量用户的数据。为了清楚地了解每个用户的信息,通常会以连接 Socket 作为键,建立一个连接到账户数据的键值对(connected[socket] = account_data)。当涉及到某些字段用于比较和查询时,例如账户 ID,通过遍历所有连接的账户数据并逐个比较来查找特定账户 ID 可能效率较低。因此需要一种方法来快速地查找账户 ID,同时避免反复更新多个字典。

2、解决方案:

答案1 中建议了一种简单而有效的方法。我们可以建立三个字典,分别使用不同的键,但都引用同一个值。这样,当我们需要更改数据时,只需要更改引用对象一次,而所有的字典都会同步更新。为了确保数据的一致性,可以创建一个包含所有三个字典的类,并提供增加、删除和更新等方法。

class DataManager:

    def __init__(self):
        self.connected = {}  # key: socket, value: account_data
        self.accountids = {}  # key: account_id, value: account_data
        self.account_data = {}  # key: account_data_id, value: account_data

    def add_account_data(self, account_data):
        """
        Add account data to the manager.

        Args:
            account_data: The account data to add.
        """
        account_data_id = generate_unique_id()
        self.connected[account_data.socket] = account_data_id
        self.accountids[account_data.account_id] = account_data_id
        self.account_data[account_data_id] = account_data

    def remove_account_data(self, socket_or_account_id):
        """
        Remove account data from the manager.

        Args:
            socket_or_account_id: The socket or account ID of the account data to remove.
        """
        if isinstance(socket_or_account_id, str):
            account_data_id = self.accountids[socket_or_account_id]
        else:
            account_data_id = self.connected[socket_or_account_id]

        del self.connected[socket_or_account_id]
        del self.accountids[account_data_id]
        del self.account_data[account_data_id]

    def update_account_data(self, account_data):
        """
        Update account data in the manager.

        Args:
            account_data: The account data to update.
        """
        account_data_id = self.connected[account_data.socket]
        self.account_data[account_data_id] = account_data

    def get_account_data(self, socket_or_account_id):
        """
        Get account data from the manager.

        Args:
            socket_or_account_id: The socket or account ID of the account data to get.

        Returns:
            The account data.
        """
        if isinstance(socket_or_account_id, str):
            account_data_id = self.accountids[socket_or_account_id]
        else:
            account_data_id = self.connected[socket_or_account_id]

        return self.account_data[account_data_id]

答案2 中则提供了另外一种方法,该方法同样高效且易于使用。我们可以将连接 Socket 作为键,将账户 ID 作为值,将账户数据作为值,建立一个字典。然后,我们可以将账户 ID 作为键,将账户数据作为值,建立另外一个字典。这样,我们可以通过连接 Socket 快速地找到账户 ID,然后通过账户 ID 快速地找到账户数据。

connected = {}  # key: socket, value: account_id
accountids = {}  # key: account_id, value: account_data

def get_account_data(socket):
    account_id = connected[socket]
    return accountids[account_id]

def update_account_data(socket, new_account_data):
    account_id = connected[socket]
    accountids[account_id] = new_account_data

无论是哪种方法,都可以创建高效的数据管理结构,使我们能够快速地查找和更新数据,同时避免了在多个字典中重复存储相同的数据。