Python 不区分大小写对字符串列表排序

任务:
你想对一个字符串列表排序,并忽略掉大小写信息。举个例子,你想要小写的a排在大写的B前面。默认的情况下,字符串比较大小写敏感的(比如所有的大写字符排在小写字符之前)。
解决方案:
string_list = ['d','s','a','i','j','A','S','D','U','N']
auxiliary_list = [(x.lower(), x) for x in string_list]
print auxiliary_list
 
auxiliary_list.sort()
print auxiliary_list
 
new_list = [x[1] for x in auxiliary_list]
print new_list
输出:
[('d', 'd'), ('s', 's'), ('a', 'a'), ('i', 'i'), ('j', 'j'), ('a', 'A'), ('s', 'S'), ('d', 'D'), ('u', 'U'), ('n', 'N')]
[('a', 'A'), ('a', 'a'), ('d', 'D'), ('d', 'd'), ('i', 'i'), ('j', 'j'), ('n', 'N'), ('s', 'S'), ('s', 's'), ('u', 'U')]
['A', 'a', 'D', 'd', 'i', 'j', 'N', 'S', 's', 'U']
Python 2.4已经提供了对DSU(decorate-sort-undecorate)的原生支持,因此(假设str_list的元素都是真正的普通字符串,而不是Unicode对象之类),可以用更简单更快的方式:
new_list = sorted(str_list, key=str.lower)
print new_list
输出:
['a', 'A', 'd', 'D', 'i', 'j', 'N', 's', 'S', 'U']

讨论:
DUS方法创建了一个辅助列表,每个元素都是元组,元组的元素则来自原列表并被当作"键"处理。这个排序是基于键的排序,因为Python的元组排序比较是根据条目顺序进行的(比如,它会首先比较元组的第一个元素)。要将一个长度为n的字符串列表排序,配合DSU的使用,lower方法只需要被调用n次,因而在第一步,decorate阶段,以及最后阶段,undecorate阶段节省了很多时间。


你可能感兴趣的:(Python)