3

特殊文字や大文字と小文字を考慮せずに、文字列のリストを昇順または降順で並べ替える方法を教えてください。

元:

list1=['test1_two','testOne','testTwo','test_one']

list.sort /sorted メソッドを適用すると、ソートされたリストになります

['test1_two', 'testOne', 'testTwo', 'test_one']

しかし、特殊文字と大文字と小文字を考慮せずに

['testOne','test_one', 'test1_two','testTwo'] OR 
['test_one','testOne','testTwo', 'test1_two' ]

list.sort /sorted メソッドは、文字の ascii 値に基づいてソートしますが、どうすれば期待した値を達成できるか教えてください

4

3 に答える 3

7

特殊文字で「文字以外のすべて」を意味する場合:

sorted(list1, key=lambda x: re.sub('[^A-Za-z]+', '', x).lower())
于 2012-11-27T17:27:43.267 に答える
3

「特殊」文字の意味によって異なりますが、定義が何であれ、これを行う最も簡単な方法は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 桁後に来るという事実を利用しています。

于 2012-11-27T17:48:22.663 に答える