无视大小写排序元组列表

7 投票
5 回答
4722 浏览
提问于 2025-04-15 20:42

我该如何高效且简单地对一个元组列表进行排序,而不考虑字母的大小写呢?

比如说这个:

[('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

你可以使用 sortkey 参数来定义你希望如何看待每个元素,以便进行排序:

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

撰写回答