我有一个元组列表(“双元组”)
[('aaa',2), ('BBB',7), ('ccc',0)]
我需要按那个顺序打印它,但是
>>> sorted([('aaa',2), ('BBB',7), ('ccc',0)])
给予
[('BBB', 7), ('aaa', 2), ('ccc', 0)]
list.sort(key=str.tolower)
(显然)不起作用,因为
AttributeError: type object 'str' has no attribute 'tolower'
我不想更改列表中的字符串。
另一个答案给了
list.sort(key=lambda (a, b): (a.lower(), b))
但这一定是 Python 2 的东西,因为
SyntaxError: invalid syntax
...首先(
itemgetter() 没有帮助,因为只允许使用一个“键”
最佳答案
你说得对,这是 Python 2 的问题,但修复非常简单:
list.sort(key=lambda a: (a[0].lower(), a[1]))
这看起来并没有那么清楚,因为名称 a
和 b
没有比 a[0]< 更多的内在含义
和 a[1]
。 (如果他们是,比方说,name
和 score
之类的东西,那可能就是另一回事了……)
Python 2 允许您将函数参数解包为元组。这在一些简单的情况下有效(有时很方便),但有很多问题。参见 PEP 3113为什么它被删除。
处理此问题的规范方法是仅拆分函数内的值,这在 lambda
中不太适用。但是,您是否有理由不能不按规定定义函数?
def twoplekey(ab):
a, b = ab
return a.lower(), b
list.sort(key=twoplekey)
作为旁注,您真的不应该将您的列表称为 list
;隐藏了 list
类型,所以你不能再使用它(例如,如果你想通过编写 list(tup)
将元组转换为列表,你将尝试调用您的列表,并得到一个莫名其妙的错误)。
关于Python:按不区分大小写的字母顺序对元组列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043709/