请告诉我如何按升序/降序对字符串列表进行排序,而不考虑特殊字符和大小写。
前:
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值进行排序但请告诉我如何实现预期的
答案 0 :(得分:7)
如果用特殊字符表示“一切不是字母”:
sorted(list1, key=lambda x: re.sub('[^A-Za-z]+', '', x).lower())
答案 1 :(得分: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”在“0”之后的74个位置的事实 ASCII。
答案 2 :(得分:0)
您还可以通过这种方式进行排序:
new_item_list.sort(key= lambda x: ''.join(e for e in x.get_author_name() if e.isalnum()))