2017-02-26 31 views
2

一連の.csv数値を列ごとに並べ替えることを検討しています。必要に応じて、列の数が異なります。パイソンを使用して、例えば:所望の結果が数値のカンマ区切り文字列を数値でソート

 ['9,11', '10,8,1', '10,70', '70,10'] 

まず、ソート最初の列で、第2によって、等

である

 print(sorted(['9,11', '70,10', '10,8,1','10,70'])) 

 ['10,70', '10,8,1', '70,10', '9,11'] 

を生成します

明らかにこれはできますが、これは優雅に行うことができますか?

+0

まず、繰り返して文字列を解析し、最初の数値を重みとして取得します。 'weight'や' value'のようなフィールドを持つクラスを作成します。反復しながら、このクラスで新しい変数を作成し、それらを使って新しいリストを生成します。それらのオブジェクトを重みに従ってソートし、最終的に1回反復し、ソートされた値を収集します。 – webmaster

答えて

3

それはsortedkey引数を使用することにより、よりエレガントに行うことができます。

data = [ 
    '9,11', 
    '70,10', 
    '10,8,1', 
    '10,70' 
] 

print sorted(data, key=lambda s: map(int, s.split(','))) 

結果:上記のコードでは

['9,11', '10,8,1', '10,70', '70,10'] 

我々は、整数のリストに私たちのリストの各文字列を変換しますこの整数値のリストをソートキーとして使用します

+0

そしてPython 3では、明らかにソートされています(data、key = lambda:list(map(int、s.split( '、')))))が必要です。データがデータフレーム内の列である場合、これを行う方法はありますか? –

1

サードパーティのモジュールを気にしない場合はnatsortは、natsortedの機能を提供し、これはsortedのドロップイン置換であるように設計されている。

>>>> import natsort 
>>> natsort.natsorted(['9,11', '70,10', '10,8,1','10,70']) 
['9,11', '10,8,1', '10,70', '70,10'] 

私はパッケージの著者です。

+0

便利なパッケージ、ありがとう、DataFramesでそれを使用する方法はありますか? –

+0

@TnatsissaHCraeser http://stackoverflow.com/questions/29580978/natural-sorting-pandas-dataframe – SethMMorton

+0

http://natsort.readthedocs.io/ – SethMMorton

関連する問題