数値と文字のリストを数値でソートしようとしています。[3a、13a、5a、11a]のような文字列のリストを数値で並べ替える
list = ['3a', '13a', '5a', '11a']
私は.sort機能を使用する場合、それはこのようにそれをソートします。それだけで最初の番号を見ていているよう
['11a', '13a', '3a', '5a']
。
数値と文字のリストを数値でソートしようとしています。[3a、13a、5a、11a]のような文字列のリストを数値で並べ替える
list = ['3a', '13a', '5a', '11a']
私は.sort機能を使用する場合、それはこのようにそれをソートします。それだけで最初の番号を見ていているよう
['11a', '13a', '3a', '5a']
。
ソートキーのラムダを渡すことができます。
list = ['3a', '13a', '5a', '11a']
list.sort(key=lambda x: int(x[:-1]))
重要な部分がある:文字列になります
lambda x: int(x[:-1])
、最後の文字を削除し、整数に変換します。
試してみるオンラインリンクを修正しました。 –
あなたの提案は安全ではありません。その1つ以上の文字があるかもしれません。 – DyZ
@DYZリストにはこのようなものが含まれていることがOPで指定されています。もちろん、そうでない場合は、あらかじめいくつかの点検を行うのが最善です。 –
あなたのリストには、文字列のリストです。したがって、list.sort
は要素を辞書的にソートします。これを変更するには、ソート関数にキーを渡します。最初にre.match
(import 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']
これが最も効果的です。
これは、キャプチャされた最初の番号を使用メモとしてのみソートします。 – dawg
あなたはちょうどそれが文字列の各文字の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
を呼び出さないことをお勧めします...)
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']
あなたは何をしようとしたのですか?はい、文字列です。辞書順にソートされます。 –
この並べ替えは文字に基づいています – Wen
似たような解決策がありますhttps://stackoverflow.com/a/2669120/5916727 – 0p3n5ourcE