-1

我有一个不同长度的字符列表,因为 ['A','B','B','A','A','B'] 我需要将它存储在数据库中。现在我将它转换为一个工作得很好的字符串,但我想知道什么是更 Pythonic。在这种特定情况下,顺序很重要,但我想知道一般的首选选项(例如,如果列表成员本身就是字符串)

谢谢

编辑:我拥有的代码是一些东西

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

shuffle(list)

str = ''.join(list)

字符串本身存储在数据库中。我不是在寻找针对我的特定代码/问题的解决方案,而且我没有性能问题 - 我想知道就 python 而言,是否有任何关于在数据库中存储 blob 的经验法则,因为字典和对象之类的东西序列化和存储似乎是合理的。perharps 这更像是一个 DB 问题而不是 python 问题。

4

4 回答 4

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
于 2013-01-15T08:49:58.897 回答
0

加入您的列表并将字符串值存储在数据库中没有任何问题。

如果您想存储不同长度的项目,例如。['A', 'AA', 'B', 'AB'] 你总是可以选择一些分隔符,例如'+'。这当然假设您知道给定的分隔符不能是列表中任何项目的一部分。

我会认为,对于许多场景,上述解决方案已经足够好了,并且它们不存在“这不是 pythonic”的问题。

但是,这比 python 案例更多 DB。有一个数据库规范化理论,它为如何组织数据提供了一些建议。您可以将数据模型重构为“第一范式”(1NF),在您的情况下,这意味着您可以创建一个单独的表来存储项目(可能还有订单信息)并通过 FK 将其与当前表链接。

有了这个,你可以为自己节省一堆问题,例如。项目重新排序,项目计数等。但另一方面,这可能会使您的查询更加昂贵,因为此解决方案需要数据库连接才能从数据库中获取您的数据。在许多情况下,在为应用程序设计数据模型时,有意执行数据库非规范化,主要是因为优化问题。

总而言之,您应该尝试预测您希望如何使用您的数据,并根据这些知识选择一个建议的(或者可能是不同的!)解决方案。

于 2013-01-15T09:37:32.383 回答
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']

雅ML:

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

如果您使用的是 SQL 数据库并希望能够在列表中进行查询,那么规范化数据库并每行存储一个列表项是解决此问题的经典方法。

于 2013-01-15T08:27:58.143 回答
-2

老实说,我不完全确定你的问题是什么。你指的是什么数据库?您如何理解一般情况,而不是按原样处理序列?但是,也许您对这样的事情感兴趣:要将您的列表转换为 Sting,请执行

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

由于您的列表元素本身就是字符串,因此这与

>>> ''.join(['ABB','AAB'])
'ABBAAB'
于 2013-01-15T08:25:58.500 回答