Python用多个字典组织数据

2024-09-26 22:50:57 发布

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

我试图创建一个小型服务器类型的应用程序,有一个关于用dicts组织数据的问题。现在我正在使用连接套接字对数据进行分组(主要是为了验证数据来自何处以及用于将数据发回)。像这样:connected[socket] = account_data。基本上,每个连接的人都会有账户数据。由于某些字段将大量用于比较和检查信息,例如帐户ID,所以我想用另一个dict加快速度

例如:要使用上述方法查找accountID,我必须使用For循环遍历connected中的所有可用连接,查看account_数据中每个连接的accountID,然后进行比较。这似乎是一个缓慢的方法。如果我可以创建一个dict并使用accountID作为键,我认为它可以加快速度。问题是,我计划使用3个不同的dicts,它们的顺序都不同。有些数据可能会频繁更改,一旦信息发生变化,更新每一个dict似乎更麻烦;有没有办法将它们链接在一起?在

也许解释我的问题的一个更简单的方法是: 你有Dict A,Dict B,Dict C和数据。Dict A、B和C都包含相同的数据。我想要这样,如果数据中有什么变化,dicta,B,C中的数据都会改变。我当然可以做dicta=data,dictb=data,等等,但是过了一段时间,代码就会重复。我知道数据是在dict创建后设置的,所以我不确定是否有解决方案。我只是在寻找在这种情况下组织数据的最佳方法的建议。在


Tags: 数据方法服务器信息应用程序类型dataaccount
3条回答

首先,数据不需要复制。你可以有3个字典,每个字典都使用不同的键,但是它的值有相同的引用。在

这样做只需更改value对象一次,这将反映在所有字典中(或者更准确地说,因为字典只存储引用,所以它们将是最新的)。在

接下来需要确保“引用完整性”,即如果删除了某个特定的记录,则需要删除所有3个词典中相应的词典条目,并且,如果修改了记录,则现在具有已更改键的词典也需要删除该记录,并将其重新添加到新关键字下。这可以通过一个包含所有3个字典并具有Add()、Remove()和(如果适用)Update()方法的类来完成。在

如果您有对字典的引用,对字典的更新将反映到具有引用的所有内容。在

客户连接并保留一个套接字sock。您加载他的帐户并将其放入connections[sock]。然后保留一个帐户id的字典(另一种方式),其中包含对帐户的引用accounts[account_id]。让我们试试。。。在

connected = {}
accounts = {}

def load_account(acct):
    return db_magic(acct)                             # Grab a dictionary from the DB

def somebody_connected(sck, acct):
    global connected, accounts
    account = load_account(acct)
    connected[sck] = account                          # Now we have it by socket
    accounts[acct["accountid"]] = account             # Now we have it by account ID

由于我们将account分配到两个不同的位置,对该字典(在任一结构中)的任何更改都将反映在另一个字典中。所以。。。在

^{pr2}$

我们在update_username中执行的更改将在执行sck.send时自动获取,因为引用完全相同。在

做一些类似的事情:

connected[socket] = accountids[account_data.accountid] = account_data

假设account_data是一个具有属性的可变对象,这将在两个dict中引用同一个对象作为值,当然还有不同的键。它没有在一个语句中,即:

^{pr2}$

同一语句中的多个赋值只是一种方便;使它按您所希望的方式工作的原因是Python通常通过“对象引用”(在赋值、参数传递、返回语句等)进行操作。在

相关问题 更多 >

    热门问题