Python:对alpha不区分大小写的顺序排序元组列表

ZZM*_*ike 3 python sorting list

我有一个元组列表("twoples")

[('aaa',2), ('BBB',7), ('ccc',0)]
Run Code Online (Sandbox Code Playgroud)

我需要按顺序打印它,但是

>>> sorted([('aaa',2), ('BBB',7), ('ccc',0)])
Run Code Online (Sandbox Code Playgroud)

[('BBB', 7), ('aaa', 2), ('ccc', 0)]

list.sort(key=str.tolower)
Run Code Online (Sandbox Code Playgroud)

(显然)不起作用,因为

AttributeError: type object 'str' has no attribute 'tolower'
Run Code Online (Sandbox Code Playgroud)

我不想更改列表中的字符串.

另一个答案给了

list.sort(key=lambda (a, b): (a.lower(), b))
Run Code Online (Sandbox Code Playgroud)

但那必须是Python 2的东西,因为

SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)

... 一开始 (

itemgetter()没有用,因为只允许一个'key'

aba*_*ert 8

你是对的,这是Python 2的东西,但修复很简单:

list.sort(key=lambda a: (a[0].lower(), a[1]))
Run Code Online (Sandbox Code Playgroud)

这似乎并不那么清楚,因为这些名称ab没有比a[0]和更具有内在意义a[1].(如果他们成功了,说,namescore什么的,这可能是一个不同的故事...)


Python 2允许您将函数参数解压缩为元组.在一些简单的情况下,这有效(并且有时很方便),但是有很多问题.有关它被移除的原因,请参阅PEP 3113.

处理这个问题的规范方法是将函数内部的值拆分,这在函数中并不常用lambda.但是有没有理由不能直接定义函数?

def twoplekey(ab):
    a, b = ab
    return a.lower(), b

list.sort(key=twoplekey)
Run Code Online (Sandbox Code Playgroud)

作为旁注,你真的不应该打电话给你的名单list; 隐藏list类型,所以你不能再使用它了(例如,如果你想通过写入将元组转换为列表list(tup),你将试图调用你的列表,并得到一个莫名其妙的错误).