Python:按姓氏排序元组并处理较低的套接字首字母

时间:2013-02-14 00:44:36

标签: python

>>> from operator import itemgetter
>>> l = [(1.23, 'Smith'), (2.34, 'Jones'), (3.45, 'de la Smith')]
>>> ol = sorted(l, key=itemgetter(1))
>>> ol
[(2.34, 'Jones'), (1.23, 'Smith'), (3.45, 'de la Smith')]

如果没有使用多个列表推导的kludge,我如何获得以下列表?

[(3.45, 'de la Smith'), (2.34, 'Jones'), (1.23, 'Smith')]

2 个答案:

答案 0 :(得分:7)

您可以提供任何功能作为密钥。 itemgetter仅适用于非常简单的案例

>>> L = [(1.23, 'Smith'), (2.34, 'Jones'), (3.45, 'de la Smith')]
>>> sorted(L, key=lambda x:x[1].lower())
[(3.45, 'de la Smith'), (2.34, 'Jones'), (1.23, 'Smith')]

对于更复杂的排序,您可能希望以通常的方式编写函数

def item_to_sort_key(item):
    n, name = item
    return name.lower()

sorted(L, key=item_to_sort_key)

将其写出来的一个优点是,为不寻常的名称编写测试用例更容易。如果您必须开始处理特殊情况,它也会很方便。

如果您的Python足够新,那么您应该使用str.casefold来代替str.lower,因为它正确处理unicode

答案 1 :(得分:2)

>>> l = [(1.23, 'Smith'), (2.34, 'Jones'), (3.45, 'de la Smith')]
>>> sorted(l, key=lambda tup: tup[1].lower())
[(3.45, 'de la Smith'), (2.33, 'Jones'), (1.23, 'Smith')]