2013-01-15 98 views
-1

我有一個不同長度的字符列表,如['A','B','B','A','A','B'] 我需要將其存儲在數據庫中。現在我將它轉換爲一個工作得很好的字符串,但我想知道什麼是pythonic。 在這種特定情況下的流程的問題,但我想知道的一般,優選選擇(如果列表成員的字符串本身,例如)在數據庫vs列表中存儲字符串

感謝

編輯: 我的代碼是什麼沿着

list = ['A','B','B','A']

shuffle(list)

str = ''.join(list)

該字符串本身被存儲在數據庫中。我不是在尋找解決我的特定代碼/問題,我沒有性能問題 - 我想知道是否有任何關於在Python中關於在數據庫中存儲Blob的經驗法則,因爲一些像字典和對象似乎是合理的序列化和存儲。 perharps這是一個比python問題更多的數據庫問題。

+0

請告訴我們[你試過什麼](http://whathaveyoutried.com/) –

+0

也請提供示例輸入和輸出,因爲它不是很清楚從問題 –

+1

序列中的字符列表是字符串的定義;所以從'list'轉換爲字符串似乎是合乎邏輯的,如果沒有其他的話,pythonic就是合乎邏輯的。那麼你覺得它非常和藹可親?如果它的實際代碼,用你正在使用的代碼編輯你的問題,也許可以在那裏改進一些東西。 –

回答

-2

說實話,我不完全確定你的問題是什麼。你指的是哪個數據庫?作爲一般情況,你理解什麼,而不是像處理序列那樣? 但是,也許你有興趣的是這樣的:爲了您的清單轉換爲刺,做

>>> ''.join(['A','B','B','A','A','B']) 
'ABBAAB' 

由於您的列表中的元素是字符串本身,這是一回事

>>> ''.join(['ABB','AAB']) 
'ABBAAB' 
0

最良好的數據庫綁定將允許您直接存儲值語義Python對象(例如PyMongo)。如果你的數據庫只接受字符串,你需要選擇一個序列化格式;在Python中,這通常意味着在pickle(快速但非人類可讀)和YaML(較慢,人類可讀,語言無關)之間進行選擇。

泡菜:

>>> from cPickle import dumps, loads 
>>> dumps(['A', 'BB', 'CCC']) 
"(lp1\nS'A'\naS'BB'\np2\naS'CCC'\np3\na." 
>>> loads(dumps(['A', 'BB', 'CCC'])) 
['A', 'BB', 'CCC'] 

YAML:

>>> from yaml import dump, load 
>>> dump(['A', 'BB', 'CCC']) 
'[A, BB, CCC]\n' 

如果您使用的是SQL數據庫,並希望能夠在列表中查詢,然後標準化數據庫和存儲一個列表項每行是解決這個問題的經典途徑。

+0

我認爲泡菜可能是過度的,因爲一個字符串可以很容易地分成一個列表 - 你不需要真的這樣做,因爲字符串是序列(雖然是不變的),所以如果所有的原始海報想要的是爲了能夠順序地訪問字符串中的字符,那麼列表將是多餘的。 –

0

不知道你在用什麼數據庫,很難給出準確的答案。如果您的數據庫只接受字符串,你可以使用repr()ast.literal_eval從標準庫和組合是非常快:

In [26]: from yaml import dump, load 

In [27]: import ast 

In [28]: l= ['A', 'BB', 'CCC'] 

In [29]: load(dump(l)) 
Out[29]: ['A', 'BB', 'CCC'] 

In [30]: ast.literal_eval(repr(l)) 
Out[30]: ['A', 'BB', 'CCC'] 

In [31]: %timeit load(dump(l)) 
1000 loops, best of 3: 1.03 ms per loop 

In [32]: %timeit ast.literal_eval(repr(l)) 
10000 loops, best of 3: 32.6 us per loop 
0

沒有什麼錯加入您的列表,並在數據庫中存儲的字符串值。

如果您想存儲不同長度的項目,例如。 ['A','AA','B','AB']你總是可以選擇一些分隔符,例如'+'。這當然假設您知道給定的分隔符不能成爲列表中的任何項目的一部分。

我會坐在上面的許多方案解決方案是足夠好的,沒有'這是不pythonic'問題與他們。

但是,這是比python更多的數據庫。有一個database normalization theory它給出了一些建議如何組織你的數據。您可以將數據模型重構爲「第一範式」(1NF),您的情況意味着您可以創建一個單獨的表來存儲項目(可能還包含訂單信息),並通過FK將其與當前表格鏈接起來。

有了這個,你可以爲自己節省一堆問題,例如。項目重新排序,項目計數等。但另一方面,這可能會使您的查詢更昂貴,因爲此解決方案需要數據庫JOIN從數據庫中獲取數據。在很多情況下,當爲應用程序數據庫denormalization設計數據模型時,故意執行主要是因爲優化問題。總結一下,你應該嘗試預測你想如何使用你的數據,並且通過這個知識選擇一個建議(或者可能是一個不同的!)解決方案。

相關問題