2009-11-12 86 views
3

我正嘗試創建一個小型服務器類型的應用程序,並且有一個關於使用字典組織數據的問題。現在我正在使用連接套接字對數據進行分組(主要是爲了驗證它來自哪裏以及將數據發回)。像這樣的:connected[socket] = account_data。基本上,每個關聯的人都將擁有賬戶數據。由於某些領域將被用於比較和檢查信息,比如賬戶ID,我想用另一個字典加快速度。Python與多個字典組織數據

例如:要找到一個accountID與上述方法,我將不得不使用一個for循環遍歷所有可用的連接在連接中,查看每個account_data中的accountID,然後進行比較。這似乎是一個緩慢的做法。如果我能創建一個字典並使用accountID作爲關鍵字,我認爲它可以加快一點。問題是,我計劃使用3種不同的排列順序。一些數據可能會頻繁變化,一旦信息發生變化,更新每一個字典似乎更麻煩一些;反正有它們連接在一起嗎?

也許一個更簡單的方法來試圖解釋我問的是: 你有字典A,字典B,字典C和數據。字典A,B和C都包含相同的數據。我希望如此,如果數據發生變化,字典A,B和C中的數據全部改變。我當然可以一直做字典A =數據,字典B =數據等,但在一段時間之後會在代碼中重複。我知道數據是在字典創建後設置的,所以我不確定是否有解決方案。我只是在這種情況下尋找組織數據的最佳方法。

回答

0

如果您有對詞典的引用,詞典的更新將反映到包含引用的所有內容中。

客戶連接並保留套接字,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兩個不同的地方,到詞典中的任何改變(在任一結構)將反映在其他。所以......

def update_username(acct_id, new_username): 
    accounts[acct_id]["username"] = new_username 

def what_is_my_username(sck): 
    sck.send(connected[sck]["username"])    # In response to GIMME_USERNAME 

我們update_username執行的更改會自動拿起當我們做了sck.send,因爲基準是完全一樣的。

+0

感謝大家的回覆。使用模塊和類來完成我需要的東西絕對有意義。會試試看。 – Chuck 2009-11-12 14:07:50

0

也許Python的發佈/訂閱模塊可以幫助你嗎? 見this question

2

首先,數據不需要被複制。你可以有3個字典,每個字典使用不同的密鑰,但是與它的值具有相同的引用。

這樣做只需要更改一次值對象,這將反映在所有字典中(或者更準確地說,因爲字典只存儲引用,它們將會更新)。

接下來,您需要確保「參考完整性」,即如果刪除了特定記錄,則需要在所有3個字典中刪除相應的字典條目,並且如果記錄被修改,則帶有現在鍵的字典更改還需要將該記錄刪除並重新添加到新密鑰下。這可以通過一個包含所有3個字典的類來完成,並且具有Add(),Remove()和(如果適用)Update()方法。

1

就做這樣的事情:

​​

假設account_data是屬性的可變對象,這將引用同一個對象在這兩個類型的字典的值,當然是有不同的密鑰。它沒有是一個聲明,即:

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

在同一語句中多次轉讓只是方便;什麼使得它以你想要的方式工作,就是Python通常通過「對象引用」(在賦值,參數傳遞,返回語句等等)進行操作。