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

时间:2015-05-05 03:21:09

标签: python list sorting

我有一个元组列表(" 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()没有帮助,因为只有一个关键词'允许

2 个答案:

答案 0 :(得分:8)

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

list.sort(key=lambda a: (a[0].lower(), a[1]))

这似乎不太清楚,因为名称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)

作为旁注,你真的不应该打电话给你的清单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])。