Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对不区分大小写的元组列表进行排序_Python_Sorting_Tuples_Case Insensitive - Fatal编程技术网

Python 对不区分大小写的元组列表进行排序

Python 对不区分大小写的元组列表进行排序,python,sorting,tuples,case-insensitive,Python,Sorting,Tuples,Case Insensitive,如何在不区分大小写的情况下高效轻松地对元组列表排序 例如: [('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')] 您可以使用排序的键参数定义您希望在排序方面如何考虑每个元素: def l

如何在不区分大小写的情况下高效轻松地对元组列表排序

例如:

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

您可以使用
排序
参数定义您希望在排序方面如何考虑每个元素:

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)

有关如何使用
的说明,请参见以下内容:

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
的可选比较函数参数要快一点。

这里有一个解决方案,它使用了Python wiki文章()中“按键排序”部分所示的装饰器思想

list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t))

Paul McGuires作品的简化版本:

list_of_tuples.sort(key=lambda t : tuple(t[0].lower()))

(其中t[0]引用了您要使用的元组元素,在本例中是第一个)

Cool,我试图找出在这种情况下如何使用key,但没有想到使用map()。谢谢很好,紧凑的解决方案。谢谢如果元组可以包含其他元组或序列结构,那么您可能需要lower_If_可能的解决方案,该解决方案封装在一个称为lower_sequence之类的递归调用程序中,该调用程序在找到本身是序列的成员时调用自身。
list_of_tuples.sort(key=lambda t : tuple(t[0].lower()))