Python: 按姓氏排序元组并处理小写首字母

1 投票
2 回答
910 浏览
提问于 2025-04-17 15:50
>>> 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 字符。

撰写回答