我有一个不同长度的字符列表,如['A','B','B','A','A','B'] 我需要将它存储在DB中。现在我把它转换成一个工作正常的字符串,但我想知道什么是pythonic。 在这个特定情况下,序列很重要,但我想知道一般的首选选项(例如,如果列表成员本身就是字符串)
由于
编辑:
我的代码就是这样
list = ['A','B','B','A']
shuffle(list)
str = ''.join(list)
字符串本身存储在数据库中。我不是在寻找我的特定代码/问题的解决方案而且我没有性能问题 - 我想知道是否有关于在数据库中存储blob的任何经验法则,就python而言,因为一些东西,如字典和对象似乎合理的序列化和存储。 perharps这更像是一个DB问题,而不是一个python问题。
答案 0 :(得分: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数据库并希望能够在列表中进行查询,那么规范化数据库并在每行存储一个列表项是解决此问题的经典方法。
答案 1 :(得分: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
答案 2 :(得分:0)
加入列表并在数据库中存储字符串值没有错。
如果您想存储不同长度的物品,例如。 ['A','AA','B','AB']你总是可以选择一些分隔符,例如'+'。这当然假设您知道给定的分隔符不能成为列表中任何项目的一部分。
我认为,对于许多场景来说,上面的解决方案已经足够好了,并且没有“这不是pythonic”的问题。
但是,这比DB的情况更多。有一个database normalization theory,它提供了一些如何组织数据的建议。您可以将数据模型重组为“第一范式”(1NF),在您的情况下,这意味着您可以创建一个单独的表来存储项目(可能还有订单信息),并通过FK将其与当前表格链接。
有了这个,你可以省去一堆问题,例如。项目重新排序,项目计数等。但另一方面,这可能会使您的查询更加昂贵,因为此解决方案需要数据库JOIN从数据库中获取您的数据。在许多情况下,在为应用程序设计数据模型时,有意执行数据库denormalization,主要是因为优化问题。
总而言之,您应该尝试预测您希望如何使用您的数据,并且掌握这些知识可以选择一种建议的(或者可能是不同的!)解决方案。
答案 3 :(得分:-2)
说实话,我不完全确定你的问题是什么。你指的是什么数据库?作为一般情况你理解什么,而不是按顺序处理序列? 但是,也许您对以下内容感兴趣:要将列表转换为Sting,请执行
>>> ''.join(['A','B','B','A','A','B'])
'ABBAAB'
由于您的列表元素本身就是字符串,因此与
相同>>> ''.join(['ABB','AAB'])
'ABBAAB'