我有一个元组列表(" twoples")
[('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()没有帮助,因为只有一个关键词'允许
答案 0 :(得分:8)
你是对的,这是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)
将元组转换为列表,您将尝试调用您的列表,并且得到一个莫名其妙的错误)。
答案 1 :(得分:0)
以下适用于Python 3:
>>> my_list = [('aaa',2), ('BBB',7), ('ccc',0)]
>>> my_list.sort(key=lambda elem: elem[0].lower())
>>> print(my_list)
[('aaa', 2), ('BBB', 7), ('ccc', 0)]
函数参数解包在Python 3中不起作用(正如您所发现的那样),但从问题的措辞来看,您似乎只关心第一个元素的比较(elem[0]
)每个元组。此示例集中于此并忽略第二个元素(elem[1]
)。