如何暂时启用字符串和数字比较?

时间:2017-03-14 23:55:08

标签: python-3.x compare

给出这个简化的排序示例:

l = [10, '0foo', 2.5, 'foo', 'bar']

我想对l进行排序,以便数字始终位于字符串之前。在这种情况下,我想获得[2.5, 10, '0foo', 'foo', 'bar']。是否有可能使数字和字符串暂时具有可比性(字符串总是大于数字)?

请注意,如果您正在考虑将key函数提供给sorted并不容易。例如,将数字转换为字符串不会起作用,因为"10"< "2.5"

1 个答案:

答案 0 :(得分:1)

您可以这样做的方法包括将key传递给已排序。它看起来像这样:

sorted(l, key=lambda x:(isinstance(x str), x))

这是有效的,因为键返回一个x类型及其值的元组。因为元组的比较方式。首先比较索引0处的项目,如果它们是相同的,则比较接下来的两个项目,依此类推它们是否相同。这允许按类型(字符串或不是字符串)对值进行排序,如果它们是类似的类型则为值。

更强大的解决方案也可以处理更多类型,可能会在键函数中使用字典,如下所示:

 sorted(l,key=lambda x:({int:0, float:0, str:1, list:2, set:3}[type(x)], x))

可以根据需要添加更多类型。