-1

['A','B','B','A','A','B'] のように、さまざまな長さの文字のリストがあり、DB に保存する必要があります。現在、問題なく機能する文字列に変換していますが、もっとpythonicなのか疑問に思っていました。この特定のケースではシーケンスが重要ですが、一般的な優先オプションを知りたいです (たとえば、リスト メンバーが文字列自体である場合)。

ありがとう

編集:私が持っているコードは何かに沿っています

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

shuffle(list)

str = ''.join(list)

文字列自体がデータベースに保存されます。特定のコード/問題の解決策を探しているわけではなく、パフォーマンスの問題もありません-辞書やオブジェクトなどのいくつかのものがあるため、Pythonに関する限り、データベースにブロブを保存することに関する経験則があるかどうかを知りたいですシリアル化して保存するのが妥当と思われます。おそらく、これはPythonの質問というよりDBの質問です。

4

4 に答える 4

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 つのリスト アイテムを格納することが、この問題を解決する従来の方法です。

于 2013-01-15T08:27:58.143 に答える
0

リストに参加し、文字列値をデータベースに保存することには何の問題もありません。

長さの異なるアイテムを収納したい場合。['A', 'AA', 'B', 'AB'] '+' などの区切り文字をいつでも選択できます。もちろん、これは、指定された区切り文字がリストのどのアイテムにも含まれないことを知っていることを前提としています。

上記の多くのシナリオでは、解決策で十分であり、「これはPythonicではない」という問題はありません。

ただし、これは python ケースよりも DB です。データを整理する方法をアドバイスするデータベース正規化理論があります。データ モデルを「第 1 正規形」(1NF) に再構築できます。これは、この場合、アイテム (およびおそらく注文情報) を格納するための別のテーブルを作成し、FK を介して現在のテーブルにリンクできることを意味します。

これがあれば、多くの問題を回避できます。アイテムの並べ替え、アイテムのカウントなど。しかし一方で、このソリューションではデータベースからデータを取得するためにデータベース JOIN が必要になるため、クエリのコストが高くなる可能性があります。多くの場合、アプリケーション データベースのデータ モデルを設計するときに、主に最適化の問題が原因で、意図的に非正規化が実行されます。

要約すると、データをどのように使用したいかを予測し、この知識に基づいて、提案された (または別の!) ソリューションの 1 つを選択する必要があります。

于 2013-01-15T09:37:32.383 に答える
0

使用しているDBがわからないと、正確な答えを出すのは困難です。repr()DB が標準ライブラリから使用できる文字列のみを受け入れる場合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 に答える
-2

正直なところ、あなたの質問が何であるかは完全にはわかりません。どのDBを参照していますか?シーケンスをそのまま処理するのではなく、一般的なケースとして何を理解していますか? ただし、次のようなことに興味があるかもしれません: リストをスティングに変換するには、次のようにします。

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

リスト要素は文字列自体であるため、これは次と同じです

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