无视大小写排序元组列表
我该如何高效且简单地对一个元组列表进行排序,而不考虑字母的大小写呢?
比如说这个:
[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)]
排序后应该变成这样:
[('a', 5), ('a', 'a'), ('A', 'b'), ('a', 'c')]
普通的字典排序会把'A'放在'a'前面,结果是这样的:
[('A', 'b'), ('a', 5), ('a', 'a'), ('a', 'c')]
5 个回答
0
像这样应该可以工作:
def sort_ci(items):
def sort_tuple(tuple):
return ([lower(x) for x in tuple],) + tuple
temp = [sort_tuple(tuple) for tuple in items]
temp.sort()
return [tuple[1:] for tuple in temp]
换句话说,就是创建一个新的列表,这个列表里的每一项都是一个元组,元组的内容是旧元组的内容,前面加上一个把旧元组每个项都变成小写的新元组。然后对这个新列表进行排序。
如果你的列表很长,这种方法比使用sort
的可选比较函数要快一些。
2
在编程中,有时候我们需要处理一些数据,这些数据可能会有不同的格式或者类型。比如说,我们可能会遇到字符串、数字、布尔值(真或假)等。为了让程序能够正确地理解和处理这些数据,我们需要进行一些转换。
数据转换就是把一种类型的数据变成另一种类型。比如,把一个数字变成字符串,或者把字符串变成数字。这种转换在编程中是非常常见的,因为不同的操作需要不同类型的数据。
有些编程语言提供了简单的方法来进行这些转换,比如使用特定的函数或者方法。这样,我们就可以很方便地在不同的数据类型之间切换。
总之,理解数据类型和如何进行转换是编程的基础,这样才能让我们的程序更灵活、更强大。
list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))
12
你可以使用 sort
的 key
参数来定义你希望如何看待每个元素,以便进行排序:
def lower_if_possible(x):
try:
return x.lower()
except AttributeError:
return x
L=[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)]
L.sort(key=lambda x: map(lower_if_possible,x))
print(L)
想了解如何使用 key
,可以查看这个链接:http://wiki.python.org/moin/HowTo/Sorting。