簡體   English   中英

在Python中拆分元組-最佳做法?

[英]Splitting tuples in Python - best practice?

我的Python代碼中有一個返回元組的方法-來自SQL查詢的一行。 假設它具有三個字段:(jobId,label,username)

為了方便在函數之間傳遞它,我將整個元組作為一個名為“ job”的變量傳遞。 最終,但是,我想了解一點,所以我一直在使用這樣的代碼:(jobId,label,username)= job

但是,我已經意識到這是維護方面的噩夢,因為現在在不破壞所有現有代碼的情況下,我永遠無法在結果集中添加新字段。 我應該怎么寫呢?

這是我的兩個最佳猜測:(jobId,label,username)=(job [0],job [1],job [2])...但是當您有15 ... 20個字段時,縮放效果不佳

或者直接將SQL查詢的結果轉換為字典並傳遞給字典(我無法控制它作為元組開始的事實,這對我來說是固定的)

@Staale

有一個更好的方法:

job = dict(zip(keys, values))

我想說字典絕對是最好的方法。 它易於擴展,允許您為每個值賦予一個合理的名稱,並且Python具有許多內置的語言功能供使用和操作字典。 如果以后需要添加更多字段,則只需更改將元組轉換為字典的代碼以及實際使用新值的代碼即可。

例如:

job={}
job['jobid'], job['label'], job['username']=<querycode>

這是一個老問題,但是...

我建議在這種情況下使用命名元組: collections.namedtuple

這是特別有用的部分:

子類化對於添加新的存儲字段沒有用。 相反,只需從_fields屬性創建一個新的命名元組類型。

也許這對於您的情況而言是矯kill過正,但是我很想創建一個“ Job”類,該類將元組作為其構造函數參數並具有各自的屬性。 然后,我將傳遞此類的實例。

一個古老的問題,但是由於沒有人提到,我將在Python Cookbook中添加它:

食譜81252:使用元組進行靈活的查詢結果訪問

該配方是專門為處理數據庫結果而設計的,並且元組解決方案允許您按名稱或索引號訪問結果。 如您的問題所述,這避免了必須通過很難維護的下標訪問所有內容。

我會用字典。 您可以通過以下方式將元組轉換為字典:

values = <querycode>
keys = ["jobid", "label", "username"]
job = dict([[keys[i], values [i]] for i in xrange(len(values ))])

這將首先創建一個數組[[“ jobid”,val1],[“ label”,val2],[“ username”,val3]],然后將其轉換為字典。 如果結果順序或計數發生變化,則只需更改鍵列表以匹配新結果。

PS本身在Python上還很新鮮,因此可能會有更好的方法來做到這一點。

如果使用的是MySQLdb程序包,則可以設置光標對象以返回dict而不是元組。

import MySQLdb, MySQLdb.cursors
conn = MySQLdb.connect(..., cursorclass=MySQLdb.cursors.DictCursor)
cur = conn.cursor() # a DictCursor
cur2 = conn.cursor(cursorclass=MySQLdb.cursors.Cursor) # a "normal" tuple cursor

對於元組,添加或更改字段總是很麻煩。 沒錯,字典會更好。

如果您想要使用稍微友好的語法的內容,則可能需要看一下有關一個簡單的“類似於結構的”對象的問題的答案。 這樣,您可以繞過一個對象(例如job ,並且比元組或dict更輕松地訪問其字段:

job.jobId, job.username = jobId, username

這個怎么樣:

class TypedTuple:
    def __init__(self, fieldlist, items):
       self.fieldlist = fieldlist
       self.items = items
    def __getattr__(self, field):
       return self.items[self.fieldlist.index(field)]

然后,您可以執行以下操作:

j = TypedTuple(["jobid", "label", "username"], job)
print j.jobid

稍后將self.fieldlist.index(field)與字典查找交換self.fieldlist.index(field)應該很容易...只需編輯__init__方法! 像Staale一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM