2

私が信じている過度に複雑なことは何もしていません。ランダムな時間順で到着するデータでいっぱいなので、大きな csv データ ファイルを事前に並べ替えています。インデックスは正しいですが、戻り値の書式設定がオフになっています。

    sortedList=sorted(reader,key=operator.itemgetter(1))

したがって、[-100 -10 -1 0 10 100 5000 6000] のようにソートする代わりに; [-1 -10 -100 0 100 5000 60] を取得します。

ラムダ関数の例と itemgetter の両方を試しましたが、そこからどこに行くべきかよくわかりません。

助けてくれてありがとう。

私の質問への答えはコメントにあります。数値は、数値ではなく文字列としてソートされていました。sorted() でキーのデータ型を指定できるとは知りませんでした。このコードは意図したとおりに機能します。

    sortedList=sorted(reader,key=lambda x:float(x[1]))
4

5 に答える 5

3

そこに表示される出力から、これらは数値ではなく文字列としてソートされているように見えます。

したがって、次のことができます。

sortedList=sorted(reader, key=lambda t: int( t[1] ))

また

sortedList=sorted(reader, key=lambda t: float( t[1] ))

または、reader作成時にシーケンスに文字列ではなく数字が入力されるようにしてください。おそらく QUOTE_NONNUMERIC をリーダーの fmtparam として使用します ( http://docs.python.org/library/csv.html#csvを参照)。 .QUOTE_NONNUMERIC )。

于 2011-05-31T21:21:38.900 に答える
1

「リーダー」は文字列を生成するように見えますが、必要なのは整数です。次のようなものを試すことができます:

    sorted(reader, key=lambda x: float(x[1]))
于 2011-05-31T21:19:25.183 に答える
0

リストが数値ではなく文字列としてソートされているようです。CSV ファイルを読み込むと、それはまだテキストであり、最初に整数に変換する必要があります。

于 2011-05-31T21:21:51.943 に答える
0

あなたの数字は数字ではなくアルファベット順に(文字列として)ソートされているようです:

>>> sorted([10,2000,30])
[10, 30, 2000]
>>> sorted(['10','2000','30'])
['10', '2000', '30']

これを修正するには、数値ソートを渡すことができます:

def numeric_compare(x, y):
    return int(x)-int(y)

>>> sorted(['10','2000','30'],cmp=numeric_compare)
['10', '30', '2000']
于 2011-05-31T21:20:31.840 に答える
0

私は好きcomposeです:

from operator import itemgetter

def compose(f, g):
    return lambda *a, **k: g(f(*a, **k))

sortedList = sorted(reader, key=compose(itemgetter(1), float))
于 2011-05-31T21:38:39.277 に答える