>>> 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')]
答案 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')]