1
>>> 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')]

如何使用多个列表推导获得以下列表而不会产生一些混乱?

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

2 回答 2

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应该使用的 Python,而不是str.lower因为它正确处理 unicode

于 2013-02-14T00:47:49.453 回答
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')]
于 2013-02-14T00:48:07.530 回答