2013-01-15 57 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设计数据模型时,故意执行主要是因为优化问题。总结一下,你应该尝试预测你想如何使用你的数据,并且通过这个知识选择一个建议(或者可能是一个不同的!)解决方案。

相关问题