web-dev-qa-db-ja.com

数値文字列のリストを昇順で並べ替えます

温度値を格納するテーブルを持つsqliteデータベースを作成しました。温度値が初めて昇順でデータベースに書き込まれます。次に、データベースから温度値をリストに読み取り、そのリストをコンボボックスに追加して温度を選択します-正常に動作します。

結果のリストは次のようになります。

templist = ['25', '50', '100', '150', '200', '250', '300'].

次に、新しい温度値、たとえば「33」をデータベースに追加します。

テーブルの最後に追加されます。今温度を読むと、リストは次のようになります。

['25', '50', '100', '150', '200', '250', '300', '33']. 

templist.sort()またはsorted(templist)を実行すると、最終結果は

['150', '200', '25', '250', '300', '33', '50']

リストを昇順で並べ替えて、私が得る簡単な方法はありますか?

['25', '33', '50', '100', '150', '200', '250', '300']
49
linuxoid

この場合の推奨されるアプローチは、データベース内のデータを並べ替え、結果を取得するクエリの最後に次のようなORDER BYを追加することです。

SELECT temperature FROM temperatures ORDER BY temperature ASC;  -- ascending order
SELECT temperature FROM temperatures ORDER BY temperature DESC; -- descending order

何らかの理由でオプションではない場合、Pythonで次のようにソート順を変更できます。

templist = [25, 50, 100, 150, 200, 250, 300, 33]
sorted(templist, key=int)               # ascending order
> [25, 33, 50, 100, 150, 200, 250, 300]
sorted(templist, key=int, reverse=True) # descending order
> [300, 250, 200, 150, 100, 50, 33, 25]

コメントで指摘されているように、受信データのタイプがintの場合、データを正しくソートするにはfloatキー(または小数部の値が格納されている場合はstring)が必要です。しかし、温度値を文字列として保存するのは非常に奇妙です。その場合は、ルートに戻って問題を修正し、保存される温度が数値であることを確認してください。

73
Óscar López

in python sortedは、整数で望みどおりに動作します。

>>> sorted([10,3,2])
[2, 3, 10]

文字列を使用しているため、問題があるようです。

>>> sorted(['10','3','2'])
['10', '2', '3']

(文字列の順序は最初の文字から始まり、「1」が「2」の前に来るため、続く文字に関係なく)key=intで修正可能

>>> sorted(['10','3','2'], key=int)
['2', '3', '10']

ソート中に値を整数に変換します(関数として呼び出されます-int('10')は整数10を返します)

また、コメントで示唆されているように、新しいリストを生成するのではなく、リスト自体をソートすることもできます。

>>> l = ['10','3','2']
>>> l.sort(key=int)
>>> l
['2', '3', '10']

しかし、私はあなたがまったく文字列を持っている理由を調べます。整数を保存および取得できるはずです。 intを保存する必要があるときに文字列を保存しているように見えますか? (sqliteは、テーブル列の型が異なっていても、与えられたのと同じ型でデータを保存するという点で、データベースの中で珍しいです)。

整数の保存を開始したら、order by ...をsqlコマンドに追加して、sqliteから並べ替えたリストを取得することもできます。

select temperature from temperatures order by temperature;
29
andrew cooke