2016-04-21 33 views
0

我想在每条记录的两个字段上记录(列表)的元组不区分大小写排序。 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=的第二个实例。

我怎样才能得到不区分大小写的排序,并在多个字段上排序呢?

+1

正确,您不能在函数调用中传递具有两个不同值的相同函数参数。 – Jens

+0

你只能使用一个排序键,所以你需要一个lambda –

+0

试着在这里使用'itemgetter','key = lambda x:operator.itemgetter(0)(x).lower()'是我唯一能够考虑到。 –

回答

8

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

他们key参数sorted需要一个函数。这个函数获取iterable的一个元素,并返回可以按照你想要的方式排序的东西。

通常,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, '')] 

你也应该知道元组总是按元素排序。这意味着,首先列表按所有元组的第一个元素排序。然后,对于第一个元素具有相同排序键的元素,使用第二个元素等。

+0

非常感谢TWO解决方案,并且非常快速地回复! –