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')]
[(3.45, 'de la Smith'), (2.34, 'Jones'), (1.23, 'Smith')]
我该如何在不使用复杂的多重列表推导的情况下,得到下面这个列表呢?
2 个回答
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')]
当然可以!请把你想要翻译的内容发给我,我会帮你把它变得简单易懂。
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 字符。