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']

最后一个利用了“z”在 ASCII 中位于“0”之后 74 位这一事实。

于 2012-11-27T17:48:22.663 回答
1

你也可以这样排序:

new_item_list.sort(key= lambda x: ''.join(e for e in x.get_author_name() if e.isalnum()))
于 2018-10-10T05:45:55.573 回答