4

このリストをソートしました:

>>> L = ['actor_1', 'actor_3', 'actor_130', 'actor_55', 'actor_5']
>>> L.sort()
>>> L
['actor_1', 'actor_130', 'actor_3', 'actor_5', 'actor_55']

次のように、下線の後の数字でリストをソート可能にするきれいな方法はありますか?:

['actor_1', 'actor_3', 'actor_5', 'actor_55', 'actor_130']
4

3 に答える 3

8

key比較キーを生成する関数を指定できます。

>>> L = ['actor_1', 'actor_3', 'actor_130', 'actor_55', 'actor_5']
>>> def sort_key(s):
...     s, n = s.split('_')
...     return s, int(n)
...
>>> L.sort(key=sort_key)
>>> L
['actor_1', 'actor_3', 'actor_5', 'actor_55', 'actor_130']
于 2013-09-05T13:31:11.480 に答える
2

正規表現とキー ラムダを使用できます。

>>> L.sort(key=lambda s: int(re.search(r'_(\d+)',s).group(1)))
>>> L
['actor_1', 'actor_3', 'actor_5', 'actor_55', 'actor_130']

Python の並べ替えは安定しているため、最初にアンダースコアの左側の文字列で並べ替え、次に右側の数字で並べ替えたい場合は、その場所で 2 回並べ替えるだけです。

>>> L = ['actor_1', 'actor_3', 'actor_130', 'actor_55', 'voice_5', 'actor_5']
>>> L.sort()
>>> L.sort(key=lambda s: int(re.search(r'_(\d+)',s).group(1)))
>>> L
['actor_1', 'actor_3', 'actor_5', 'voice_5', 'actor_55', 'actor_130']

または、キー関数でタプルを返し、最初に数字でソートし、次に LH 文字列でソートすることで、同じことを行うことができます。

>>> L.sort(key=lambda s: (int(re.search(r'_(\d+)',s).group(1)),s))
>>> L
['actor_1', 'actor_3', 'actor_5', 'voice_5', 'actor_55', 'actor_130']

または:

>>> L.sort(key=lambda s: (int(s.split('_')[1]), s))

多く の場合、1 回の複雑な並べ替えよりも 2 回の並べ替えを行う方が高速です。

于 2013-09-05T13:47:52.700 に答える
2

番号を別のリストに分けて、両方を一緒に並べ替えることができます。

>>> L = ['actor_1', 'actor_3', 'actor_130', 'actor_55', 'actor_5']
>>> n = [int(x.split('_')[1]) for x in L]
>>> n
[1, 3, 130, 55, 5]
>>> L = [x for (y, x) in sorted(zip(n, L))]
>>> L
['actor_1', 'actor_3', 'actor_5', 'actor_55', 'actor_130']
于 2013-09-05T13:31:26.340 に答える