2017-08-13 1 views
0

数値と文字のリストを数値でソートしようとしています。[3a、13a、5a、11a]のような文字列のリストを数値で並べ替える

list = ['3a', '13a', '5a', '11a'] 

私は.sort機能を使用する場合、それはこのようにそれをソートします。それだけで最初の番号を見ていているよう

['11a', '13a', '3a', '5a'] 

+0

あなたは何をしようとしたのですか?はい、文字列です。辞書順にソートされます。 –

+0

この並べ替えは文字に基づいています – Wen

+0

似たような解決策がありますhttps://stackoverflow.com/a/2669120/5916727 – 0p3n5ourcE

答えて

2

ソートキーのラムダを渡すことができます。

list = ['3a', '13a', '5a', '11a'] 
list.sort(key=lambda x: int(x[:-1])) 

重要な部分がある:文字列になります

lambda x: int(x[:-1]) 

、最後の文字を削除し、整数に変換します。

Try it online!

+0

試してみるオンラインリンクを修正しました。 –

+0

あなたの提案は安全ではありません。その1つ以上の文字があるかもしれません。 – DyZ

+0

@DYZリストにはこのようなものが含まれていることがOPで指定されています。もちろん、そうでない場合は、あらかじめいくつかの点検を行うのが最善です。 –

2

あなたのリストには、文字列のリストです。したがって、list.sortは要素を辞書的にソートします。これを変更するには、ソート関数にキーを渡します。最初にre.matchimport re)を使用して数字を抽出して比較することができます。このような何か:あなたの要素は、それらの最後にa以上の何かを持っている場合

In [30]: list_ = ['3a', '13a', '5a', '11a'] 

In [31]: matcher = re.compile('\d+') 

In [32]: sorted(list_, key=lambda x: int(matcher.match(x).group())) 
Out[32]: ['3a', '5a', '11a', '13a'] 

これが最も効果的です。

+1

これは、キャプチャされた最初の番号を使用メモとしてのみソートします。 – dawg

4

あなたはちょうどそれが文字列の各文字のASCIIコードにソートされますそのままsortedを使用する場合:

>>> sorted(['2','11','01000']) 
['01000', '11', '2'] 

整数値を使用するようにsortedを伝えるキー値を追加する対:

>>> sorted(['2','11','01000'], key=int) 
['2', '11', '01000'] 

整数と文字が混在している文字列の場合は、natural sortを使用します。文字は辞書順にソートされ、数字は単純な整数比較に処理されます。

import re 

def natural_sort(l): 
    convert = lambda text: int(text) if text.isdigit() else text.lower() 
    alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] 
    return sorted(l, key = alphanum_key) 

>>> li = ['3a', '13a', '5a', '11a'] 
>>> natural_sort(li) 
['3a', '5a', '11a', '13a'] 

このバージョンの利点は、それが数字と文字の複数のグループを扱うです:

>>> li = ['3a33', '3a2', '3b1', '3a1', '5a', '11a'] 
>>> natural_sort(li) 
['3a1', '3a2', '3a33', '3b1', '5a', '11a'] 

と同様に、あなたは前の文字で期待するもの:

>>> li = ['a33', 'a2', 'b1', 'a1', 'a', 'a00004'] 
>>> natural_sort(li) 
['a', 'a1', 'a2', 'a00004', 'a33', 'b1'] 

(PS :関数の名前に遭遇するので、Pythonリストlistを呼び出さないことをお勧めします...)

1

0と呼ばれるパッケージがありますnatsortを使用して仲の良い友達の一例@

from natsort import natsorted 
LL = ['3a', '13a', '5a', '11a'] 
natsorted(LL) 

Out[296]: ['3a', '5a', '11a', '13a'] 

li = ['3a33', '3a2', '3a1', '13a', '5a', '11a'] 

natsorted(li) 
Out[298]: ['3a1', '3a2', '3a33', '5a', '11a', '13a'] 
関連する問題