2013-10-27 4 views
11

私は人間が読める方法でいくつかの結果を表示しようとしています。この質問の目的のために、それらのいくつかは数字であり、いくつかは手紙であり、いくつかは2つの組み合わせである。辞書順ではない結果を並べ替えますか?

input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance'] 
sorted_input = sorted(input) 
print(sorted_input) 

望ましい結果:

['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello'] 

実際の結果:私は「

['0', '1', '10', '100', '2', '3', 'Allowance', 'Hello'] 

は、私は彼らがこのように並べ替えるために得ることができる方法を把握しようとしていますこれをどうやってやっていくのか困っている。

+1

の可能重複[んPythonは文字列の自然ソートのための機能が組み込まれています?](http://stackoverflow.com/questions/4836710/does- Python-have-a-built-in-function-for-string-natural-sort) –

答えて

11

1 - インストールnatsortモジュール

pip install natsort 

2 - インポートはインポートされました

>>> input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance'] 

>>> from natsort import natsorted 
>>> natsorted(input) 
['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello'] 

出典:https://pypi.python.org/pypi/natsort

+0

ニース。なぜすでに解決されている問題を解決するのですか? – jpmc26

+0

素晴らしい - これはまさに私が必要なものです! – user2923558

+2

リンクhttps://github.com/SethMMorton/natsort –

3

私は過去に非常に有用な天然のソート順について次のリンクのコードを発見した:

http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html

+0

これは実際にどのように動作しているかを理解するのに本当に便利でしたが、これとMingyuをマークする間に引き裂かれました。使用可能な解決策でしたが、これは素晴らしい読書でした。 – user2923558

1

これはそれを行います。比較の目的のために、それは、その整数の整数に変換することができる文字列を変換し、単独で他の文字列を残す:

def key(s): 
    try: 
     return int(s) 
    except ValueError: 
     return s 

sorted_input = sorted(input, key=key) 
+0

私はあなたがこの部分を見逃したと思います。「いくつかは2つの組み合わせです」。 "unorderable types" –

+1

のため、Python3ではうまくいきません。その場合、彼らが望むものについて言わなかったので、それを見ても無視しました。 –

+3

"あいまいさに直面して、推測する誘惑。私はよく知っていたはずです:) –

0

あなたの特定のケースの場合:

def mySort(l): 
    numbers = [] 
    words = [] 
    for e in l: 
     try: 
      numbers.append(int(e)) 
     except: 
      words.append(e) 
    return [str(i) for i in sorted(numbers)] + sorted(words) 

print mySort(input) 
0

あなたは、ソート、そしてそれを一緒に戻して、リストを分割できます。このような何かを試してみてください:

numbers = sorted(int(i) for i in input_ if i.isdigit()) 
nonnums = sorted(i for i in input_ if not i.isdigit()) 
sorted_input = [str(i) for i in numbers] + nonnums 

あなたは非整数を持つことができる場合isdigitよりも複雑な何かをする必要があります。

これはあなたの「いくつかは2つの組み合わせです」をカバーしていない場合は、その意味とそれらから期待される出力を詳しく説明してください。

(テストが、アイデアを伝えなければならないわけではありません。)

関連する問題