Skip to main content
 首页 » 编程设计

python之用两个 key= 参数排序

2025年05月04日10oomusou

我想要在每条记录的两个字段上使用不区分大小写的记录(列表)元组。 HowTo/Sorting 告诉我如何不区分大小写 (key=str.lower),它告诉我如何对两个键进行排序 (key=operator.itemgetter(0,1) )。我尝试了以下方法:

parts = [ 
    ('A',2,''), 
    ('a',1,''), 
    ('b',2,''), 
    ('B',1,''), 
] 
foo = sorted(parts, key=str.lower, key=operator.itemgetter(0,1)) 
print(foo) 

Python 不喜欢同一个 sorted 中的两个 key=。它说:SyntaxError: keyword argument repeated,指向 key= 的第二个实例。

如何进行不区分大小写的排序,以及对多个字段进行排序?

请您参考如下方法:

您的代码的问题在于您两次传递相同的参数。这是不可能的。

它们是 sorted 的 key 参数期望一个函数。此函数获取可迭代对象的一个​​元素并返回可按照您想要的方式排序的内容。

通常,lambda functions (这意味着内联函数)被使用:

parts = [('A', 2, ''), 
         ('a', 1, ''), 
         ('b', 2, ''), 
         ('B', 1, '')] 
foo = sorted(parts, key=lambda s: (s[0].lower(), s[1])) 
print(foo) 

但您也可以创建一个“真正的”函数:

parts = [('A', 2, ''), 
         ('a', 1, ''), 
         ('b', 2, ''), 
         ('B', 1, '')] 
 
def my_sorting(element): 
    return (element[0].lower(), element[1]) 
 
bar = sorted(parts, key=my_sorting) 
print(bar) 

都给

[('a', 1, ''), ('A', 2, ''), ('B', 1, ''), ('b', 2, '')] 

您还应该知道元组总是按元素排序的。这意味着,首先列表按所有元组的第一个元素排序。然后,对于与第一个元素具有相同排序键的元素,使用第二个元素,依此类推。