2017-05-22 15 views
1

ファイルをPythonがそうするように一貫した方法でソートする必要があります。UNIXソート - 文字比較アルゴリズム

私はUNIXのsortプログラムを使っていくつかのファイルをソートしました。このファイルをソートした後、私はそれが正しくソートされたかどうかをチェックするためのPythonスクリプトを書いた:スクリプトは次のエントリを与える失敗

with open('my_file_location') as f: 
    last_l = next(f) 
    for l in f: 
     if last_l > l: 
      print(last_l, l) 
      break 
     last_l = l 

('250,8\n', '25,1\n') 

を私がいるかどうかを確認するために、並べ替えツールでビットを実験しました出力は実際には反復可能であり、Pythonの比較アルゴリズムと矛盾しています。最後に、2つの興味深いケースが見つかりました:

$ echo -e "250,1\n25,8" | sort 
250,1 
25,8 
$ echo -e "250,\n25," | sort 
25, 
250, 

なぜこれらの2つのコールが私に2つの異なる注文を与えるのですか?私はちょっと変わったと思っています。なぜなら、最初の文字は変わらず変わらないからです。

私のファイルはかなり巨大で、私の現在のソートされたファイルにとどまるのが最良です。同じ文字列比較をPythonでどのように適用できますか?

この比較をすばやく実装できない場合や、その他の問題が発生する可能性がある場合は、sortを使用してファイルを並べ替えるにはどうしたらよいですか?

UPDATE(Unixのsortツールの出力と一致しない)以下のPython出力の

例:

>>> '250,1' > '25,8' 
True 
>>> '250,' > '25,' 
True 

反してUnixのsortツールに、Pythonで両方の比較は、同じ結果を与えます。

+0

(http://stackoverflow.com/questions/4836710/do-python-have-a-built-in-string-natural-sort) –

+0

あなたの現在のロケールは 'sort'によって生成された順序に影響します - ' LC_ALL = C echo -e "250,1 \ n25、 | 8インチソート 'はあなたの例と一貫性があるはずです... – ewcz

+0

@Chris_Randsなぜ' echo |ソート 'コールは2つの異なる注文を与え、なぜそれがPythonでは起こらないのですか?この例で質問が更新されました。 – pt12lol

答えて

1

あなたはロケールがで犯人であることを確認することができます[?んPythonの文字列の自然ソートのための機能が組み込まれています]の可能な重複が

import locale 

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') 
L = ['250,1', '25,8'] 
print(sorted(L, cmp=locale.strcoll)) 
#['250,1', '25,8'] 

locale.setlocale(locale.LC_ALL, 'C') 
print(sorted(L, cmp=locale.strcoll)) 
#['25,8', '250,1'] 
+0

'locale.setlocale'そして' locale.strcoll'関数を呼び出すことは私の問題の解決策であるようです。 – pt12lol