「特殊」文字の意味によって異なりますが、定義が何であれ、これを行う最も簡単な方法はkey
関数を定義することです。
文字だけを気にする場合:
from string import letters, digits
def alpha_key(text):
"""Return a key based on letters in `text`."""
return [c.lower() for c in text if c in letters]
>>> sorted(list1, key=alpha_key)
['testOne', 'test_one', 'test1_two', 'testTwo']
数字も気にする場合:
def alphanumeric_key(text):
"""Return a key based on letters and digits in `text`."""
return [c.lower() for c in text if c in letters + digits]
>>> sorted(list1, key=alphanumeric_key)
['test1_two', 'testOne', 'test_one', 'testTwo']
文字と数字に関心があり、文字の後に数字を並べ替えたい場合(出力例の場合のように見えます):
def alphanum_swap_key(text):
"""Return a key based on letters and digits, with digits after letters."""
return [ord(c.lower()) % 75 for c in text if c in letters + digits]
>>> sorted(list1, key=alphanum_swap_key)
['testOne', 'test_one', 'testTwo', 'test1_two']
この最後のものは、ASCII では "z" が "0" の 74 桁後に来るという事実を利用しています。